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
}
}
4条答案
按热度按时间30byixjq1#
MSDN Library文章中明确提到了Socket.ReceiveTimeout:
获取或设置一个值,该值指定synchronousReceive调用将在多长时间后超时。
强调。当您使用ReceiveAsync()时,您执行的是与同步接收相反的操作。解决方法是使用System.Timers.Timer,它在调用之前启动,调用之后停止。关闭Elapsed事件处理程序中的套接字,以便ReceiveAsync()方法终止并出现ObjectDisposed异常。
m1m5dgzv2#
是的。
Socket
上的异步方法没有实现超时。如果你需要异步操作的超时,你必须自己创建(例如,使用Task.Delay
和Task.WhenAny
)。bfhwhh0e3#
我最近遇到了这个问题,这是我如何解决它:
qcuzuvrc4#
不管怎么说,我是这样做的(也可能结合取消令牌):
技巧是在Task.WaitAny调用中等待UDP接收任务。