当前位置:  开发笔记 > 程序员 > 正文

C#:UDP侦听器线程

如何解决《C#:UDP侦听器线程》经验,为你挑选了1个好方法。

我想在我的XNA-Networkgame中使用UDP-Sockets.现在我正在尝试编写可靠的Listenetraread,但是有一些问题.

如果我使用socket.Receive它会等到一个数据包.这对我的Listenetraread很好.我的线程有一个像这样的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-listening-thread,我可以优雅地停止.:-)在MSDN中,我没有找到一个侦听器示例,它正在侦听多个数据包.如何处理其他程序员呢?



1> Kiril..:

Listen标志标记为易失性,因此线程之间可以看到更改.

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();

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有