2012-09-28 293 views

回答

3

據MSDN庫文章Socket.ReceiveTimeout中明確提到:

獲取或設置指定時間在這之後,同步接收呼叫將超時量的值。

強調增加。當您使用ReceiveAsync()時,您正在做與同步接收相反的操作。解決方法是使用在調用之前啓動的System.Timers.Timer,然後停止。關閉Elapsed事件處理程序中的套接字,以便ReceiveAsync()方法以ObjectDisposed異常終止。

+0

好主意。有沒有任何線程安全問題像這樣關閉套接字,而另一個線程正在等待呢? – bradgonesurfing

+0

我不可能回答,沒有任何體面的信息。然而,從一個套接字異步讀取多線程並不是一個問題,這是不可能的。 –

4

是的。 Socket上的異步方法不執行超時。如果在異步操作中需要超時,則必須自己創建它們(例如,使用Task.DelayTask.WhenAny)。

0

最近,我有這個問題,這是我如何解決它:

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 
    } 
} 
+0

請注意,如果超時被觸發,則讀取仍在運行,並最終將丟棄它收到的數據。如果在超時的情況下關閉整個套接字,則只能使用這種技術。 – usr