gpt4 book ai didi

multithreading - C# : UDP Listener Thread

转载 作者:行者123 更新时间:2023-12-01 19:51:10 25 4
gpt4 key购买 nike

我想在我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com