我想在我的 XNA-Networkgame 中使用 UDP 套接字。 现在我正在尝试编写一个可靠的监听线程,但存在一些问题。
如果我使用socket.Receive,它将等待一个数据包。这对于我的监听线程来说很好。 我的线程有一个像这样的 while 循环:
while(Listen == true)
{
socket.Receive(...);
}
但是如果我将 Listen-Flag 交换为 false(如果我想停止监听),它将卡在最后一个 .Receive() 中。
然后我查看了 Methodes .BeginReceive()。如果数据包到达,它将调用方法。 但要接收数据,我必须使用 .EndReceive(),这就是我遇到的问题。我想仍然监听数据包,并且在数据包到达时不要停止监听。
所以我仍然使用带有“.Receive()”的阻塞版本。我可以通过调用 Thread.abort() 来强制监听线程取消,但这并不好。
目前我测试数据是否可用:
while(Listen == true)
{
if(socket.Available > 0)
{
socket.Receive(...);
}
}
但我认为这不是最好的方法...如果在 if 子句之后不久,另一个线程正在调用 socket.Receive(..) ,它将再次无意中卡住。 有没有办法取消.Receive(..)方法? 我尝试设置超时,但是如果.Receive超时,就会抛出异常...
我想要一个简单的 udp 监听线程,我可以优雅地停止。 :-) 在 MSDN 中,我没有找到一个监听多个数据包的监听器示例。 如何处理其他程序员这个问题?
最佳答案
将Listen
标记标记为 volatile ,因此线程之间的更改是可见的。
public volatile bool Listen{get; set;}
处理线程中适当的异常:
Thread listener = new Thread(()=>
{
while(Listen == true)
{
try
{
socket.Receive();
}
catch(ThreadInterruptException)
{
break; // exit the while loop
}
catch(SocketException)
{
break; // exit the while loop
}
}
});
listener.IsBackground = true;
listener.Start();
在将 Listen
标志切换为 false
的代码中,您可以关闭套接字或中断线程:
Listen = false;
socket.Shutdown(SocketShutdown.Both);
socket.Close();
//
// OR
//
listener.Interrupt();
关于multithreading - C# : UDP Listener Thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3627013/