9

我正在使用如下所示的 UDPClient

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

但是,即使我设置了超时,等待也不会终止或抛出。这是正常行为吗?

4

3 回答 3

7

Socket.ReceiveTimeout 的 MSDN 库文章中明确提到了它:

获取或设置一个值,该值指定同步Receive 调用将超时的时间量。

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

于 2012-09-28T14:51:57.220 回答
6

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

于 2012-09-28T12:16:21.803 回答
3

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

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
    }
}
于 2017-11-30T16:05:46.677 回答