我使用UDPClient像下面等待UDPClient.ReceiveAsync與超時
dim c = New UDPClient(port)
client.CLient.ReceiveTimeout = 1
await client.ReceiveAsync()
然而AWAIT不會終止或者雖然我已經設置了超時扔甚至 。這是正常的 行爲?
我使用UDPClient像下面等待UDPClient.ReceiveAsync與超時
dim c = New UDPClient(port)
client.CLient.ReceiveTimeout = 1
await client.ReceiveAsync()
然而AWAIT不會終止或者雖然我已經設置了超時扔甚至 。這是正常的 行爲?
據MSDN庫文章Socket.ReceiveTimeout中明確提到:
獲取或設置指定時間在這之後,同步接收呼叫將超時量的值。
強調增加。當您使用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
}
}
請注意,如果超時被觸發,則讀取仍在運行,並最終將丟棄它收到的數據。如果在超時的情況下關閉整個套接字,則只能使用這種技術。 – usr
好主意。有沒有任何線程安全問題像這樣關閉套接字,而另一個線程正在等待呢? – bradgonesurfing
我不可能回答,沒有任何體面的信息。然而,從一個套接字異步讀取多線程並不是一個問題,這是不可能的。 –