multithreading - C#处理线程和阻塞套接字

标签 multithreading blocking

在以下线程中,从客户端读取UDP数据包,直到 bool 字段Run设置为false为止。

如果在Receive方法阻塞时将Run设置为false,则它将永远保持阻塞状态(除非客户端发送数据,否则它将导致线程循环并再次检查Run条件)。

while (Run)
{
    IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
    byte[] data = udpClient.Receive(ref remoteEndPoint); // blocking method

    // process received data
}

我通常通过在服务器上设置超时来解决此问题。它工作正常,但对我来说似乎是一个不完整的解决方案。
udpClient.Client.ReceiveTimeout = 5000;

while (Run)
{
    try
    {
        IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
        byte[] data = udpClient.Receive(ref remoteEndPoint); // blocking method

        // process received data
    }
    catch(SocketException ex) {} // timeout reached
}

您将如何处理这个问题?有什么更好的办法吗?

最佳答案

使用UdpClient.Close()。这将终止阻塞的Receive()调用。准备捕获ObjectDisposedException,它向您的线程发出套接字已关闭的信号。

关于multithreading - C#处理线程和阻塞套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5525551/

相关文章:

java - Java `synchronized` 是否阻止锁定对象引用或值?

scala - 如何为阻塞调用设置超时?

c++ - Boost asio io_content 运行非阻塞

delphi - 创造 *。 Mht 文件(网络存档)

oauth-2.0 - Googles AuthorizationCodeInstalledApp.authorize() 方法在取消身份验证时卡住

JavaScript:异步事件回调的线程安全? (我需要 'volatile' 还是什么?)

java - 字段超出范围java

c# - 我应该对 "latency-critical"线程使用线程关联吗?

Java 同步和线程

java - 使用阻塞 IO 的多线程会损坏 Java 中的文件