等待UDPClient.ReceiveAsync超时

时间:2012-09-28 10:19:33

标签: .net timeout udpclient async-await

我使用下面的UDPClient

dim c = New UDPClient(port)
client.CLient.ReceiveTimeout = 1
await client.ReceiveAsync()

然而await不会终止或抛弃 虽然我设置了超时。这是正常的吗? 行为?

3 个答案:

答案 0 :(得分:6)

是。 Socket上的异步方法不实现超时。如果您需要在异步操作上超时,则必须自己创建(例如,使用Task.DelayTask.WhenAny)。

答案 1 :(得分:4)

在MSDN Library文章中明确提到了Socket.ReceiveTimeout:

  

获取或设置一个值,该值指定同步接收呼叫超时之前的时间量。

重点补充。使用ReceiveAsync()时,您正在执行与同步接收相反的操作。解决方法是使用在调用之前启动的System.Timers.Timer,然后停止。关闭Elapsed事件处理程序中的套接字,以便ReceiveAsync()方法以ObjectDisposed异常终止。

答案 2 :(得分:1)

我最近遇到了这个问题,这就是我解决它的方法:

async Task Listen(IPEndPoint ep, int timeout)
{
    using (var udp = new UdpClient(ep))
    {
        var result = await Task.Run(() =>
        {
            var task = udp.ReceiveAsync();
            task.Wait(timeout);
            if (task.IsCompleted)
            { return task.Result; }
            throw new TimeoutException();
        });

        Receive(result); // use the result
    }
}