Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading C#处理螺纹和阻塞插座_Multithreading_Blocking - Fatal编程技术网

Multithreading C#处理螺纹和阻塞插座

Multithreading C#处理螺纹和阻塞插座,multithreading,blocking,Multithreading,Blocking,在下面的线程中,从客户端读取UDP数据包,直到布尔字段Run设置为false 如果在Receive方法阻塞时Run设置为false,它将永远保持阻塞状态(除非客户端发送数据,这将使线程循环并再次检查运行条件) 我通常通过在服务器上设置超时来解决这个问题。它工作得很好,但对我来说似乎是一个零碎的解决方案 udpClient.Client.ReceiveTimeout = 5000; while (Run) { try { IPEndPoint remoteEndP

在下面的线程中,从客户端读取UDP数据包,直到布尔字段Run设置为false

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

我通常通过在服务器上设置超时来解决这个问题。它工作得很好,但对我来说似乎是一个零碎的解决方案

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,它向线程发出套接字已关闭的信号。

您可以执行以下操作:

private bool run;
public bool Run
{
    get
    {
        return run;
    }

    set
    {
        run = value;
        if(!run) 
        {
            udpClient.Close();
        }

    }   
}

这允许您在满足任何条件后关闭客户端,以停止连接侦听。可能会引发异常,但我不相信它会是SocketTimeoutException,因此您需要处理它。

在调用close之前只需调用disconnect,它不会引发异常。
private bool run;
public bool Run
{
    get
    {
        return run;
    }

    set
    {
        run = value;
        if(!run) 
        {
            udpClient.Close();
        }

    }   
}