当前位置:  开发笔记 > 编程语言 > 正文

我可以在C#中设置UdpClient的超时时间吗?

如何解决《我可以在C#中设置UdpClient的超时时间吗?》经验,为你挑选了2个好方法。

我想知道我是否可以为UdpClient接收方法设置超时值.

我想使用块模式,但因为有时udp会丢失数据包,我的程序udpClient.receive将永远挂在那里.

我有什么好主意可以管理它?



1> 小智..:

有一个SendTimeout和一个ReceiveTimeout属性,你可以使用SocketUdpClient.

以下是5秒超时的示例:

var udpClient = new UdpClient();

udpClient.Client.SendTimeout = 5000;
udpClient.Client.ReceiveTimeout = 5000;

...


仅在执行同步发送/接收时,此方法才有效。对于异步调用,可以使用Task.Delay来创建自己的超时,例如Task.WhenAny(udpClient.ReceiveAsync(),Task.Delay(5000));

2> Brad Nabholz..:

Filip所指的是嵌套在UdpClient包含(UdpClient.Client.ReceiveTimeout)的套接字中.

您也可以使用异步方法执行此操作,但手动阻止执行:

var timeToWait = TimeSpan.FromSeconds(10);

var udpClient = new UdpClient( portNumber );
var asyncResult = udpClient.BeginReceive( null, null );
asyncResult.AsyncWaitHandle.WaitOne( timeToWait );
if (asyncResult.IsCompleted)
{
    try
    {
        IPEndPoint remoteEP = null;
        byte[] receivedData = udpClient.EndReceive( asyncResult, ref remoteEP );
        // EndReceive worked and we have received data and remote endpoint
    }
    catch (Exception ex)
    {
        // EndReceive failed and we ended up here
    }
} 
else
{
    // The operation wasn't completed before the timeout and we're off the hook
}

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