C#UDP侦听器是否取消阻塞?或者防止重新接收被卡住

C#UDP侦听器是否取消阻塞?或者防止重新接收被卡住,c#,udp,C#,Udp,我一直在寻找以前的问题,比如我的问题,但似乎我找不到我需要的答案 我的目标是防止UDP侦听器不挂起。我有一个UDP侦听器,它在等待消息,但如果没有任何消息可以接收,它就挂在那里 我读过其他线程,他们说我需要将阻塞设置为false,但我找不到如何设置它。抱歉,我刚刚接触C#和socket编程 以下是我的听众部分: while (true) { try { byte[] data = listener.Receive(ref groupEP); IP

我一直在寻找以前的问题,比如我的问题,但似乎我找不到我需要的答案

我的目标是防止UDP侦听器不挂起。我有一个UDP侦听器,它在等待消息,但如果没有任何消息可以接收,它就挂在那里

我读过其他线程,他们说我需要将阻塞设置为false,但我找不到如何设置它。抱歉,我刚刚接触C#和socket编程

以下是我的听众部分:

while (true)
{
    try
    {
        byte[] data = listener.Receive(ref groupEP);

        IPEndPoint newuser = new IPEndPoint(groupEP.Address, groupEP.Port);
        string sData =  (System.Text.Encoding.ASCII.GetString(data));

    }
    catch (Exception e)
    {
    }
}
我的问题是它只是冻结在以下行上:

byte[] data = listener.Receive(ref groupEP);

使用UDPClient上的available属性(如果您正在使用该属性)确定网络队列中是否有数据要读取

while (true)
{
    try
    {
        if (listener.Available > 0) // Only read if we have some data 
        {                           // queued in the network buffer. 
            byte[] data = listener.Receive(ref groupEP);

            IPEndPoint newuser = new IPEndPoint(groupEP.Address, groupEP.Port);
            string sData =  (System.Text.Encoding.ASCII.GetString(data));
        }
    }
    catch (Exception e)
    {
    }
}

//这非常清楚和简单。

您使用的是接收/发送的阻塞版本。考虑使用异步版本(接收异步/开始接收)。

但是,如果没有任何循环中断,它实际上是否与原始代码相同?最好是在Receive()处阻塞,而不是在循环中使用连续的if(可用)检查来烧掉CPU,不是吗?添加一个
Thread.Sleep(10)
try{}
子句中,CPU烧录完全消失。。
        UdpClient client = new UdpClient();
        //Some code goes here ...
        client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 2000);