我使用下面的UDPClient
dim c = New UDPClient(port)
client.CLient.ReceiveTimeout = 1
await client.ReceiveAsync()
然而await不会终止或抛弃 虽然我设置了超时。这是正常的吗? 行为?
答案 0 :(得分:6)
是。 Socket
上的异步方法不实现超时。如果您需要在异步操作上超时,则必须自己创建(例如,使用Task.Delay
和Task.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
}
}