我正在使用如下所示的 UDPClient
dim c = New UDPClient(port)
client.CLient.ReceiveTimeout = 1
await client.ReceiveAsync()
但是,即使我设置了超时,等待也不会终止或抛出。这是正常行为吗?
我正在使用如下所示的 UDPClient
dim c = New UDPClient(port)
client.CLient.ReceiveTimeout = 1
await client.ReceiveAsync()
但是,即使我设置了超时,等待也不会终止或抛出。这是正常行为吗?
Socket.ReceiveTimeout 的 MSDN 库文章中明确提到了它:
获取或设置一个值,该值指定同步Receive 调用将超时的时间量。
重点补充。当您使用 ReceiveAsync() 时,您正在执行与同步接收相反的操作。解决方法是使用 System.Timers.Timer 在调用之前启动并在之后停止。关闭 Elapsed 事件处理程序中的套接字,以便 ReceiveAsync() 方法以 ObjectDisposed 异常终止。
是的。上的异步方法Socket
不实现超时。如果您需要异步操作超时,您必须自己创建它们(例如,使用Task.Delay
and 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
}
}