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