【发布时间】:2012-09-20 05:25:38
【问题描述】:
我正在使用如下所示的 UDPClient
dim c = New UDPClient(port)
client.CLient.ReceiveTimeout = 1
await client.ReceiveAsync()
但是,await 不会终止,甚至不会抛出 虽然我设置了超时。这是正常的吗 行为?
【问题讨论】:
标签: .net timeout udpclient async-await
我正在使用如下所示的 UDPClient
dim c = New UDPClient(port)
client.CLient.ReceiveTimeout = 1
await client.ReceiveAsync()
但是,await 不会终止,甚至不会抛出 虽然我设置了超时。这是正常的吗 行为?
【问题讨论】:
标签: .net timeout udpclient async-await
MSDN 库文章中明确提到了 Socket.ReceiveTimeout:
获取或设置一个值,该值指定同步 Receive 调用将在多长时间后超时。
添加了重点。当您使用 ReceiveAsync() 时,您正在执行与同步接收相反的操作。解决方法是使用 System.Timers.Timer 在调用之前启动并在之后停止。在 Elapsed 事件处理程序中关闭套接字,以便 ReceiveAsync() 方法以 ObjectDisposed 异常终止。
【讨论】:
是的。 Socket 上的异步方法不实现超时。如果您需要异步操作超时,您必须自己创建它们(例如,使用 Task.Delay 和 Task.WhenAny)。
【讨论】:
我最近遇到了这个问题,我就是这样解决的:
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
}
}
【讨论】: