2012-10-26 69 views
2

我在搞亂UDP偵聽器和TAP。具有基於任務的異步模式的UDP偵聽器

我有一個類負責監聽傳入的UDP並可以啓動和停止。 在start()方法簡單地調用下面的方法

private async void Listen() 
    { 
     var resp = await _udpClient.ReceiveAsync().ConfigureAwait(continueOnCapturedContext: false); 

     var eventHandler = PacketReceived; 
     if (eventHandler != null) 
      eventHandler(this, new UdpPacketReceivedEventArgs(resp)); 

     if (_running) 
      Listen(); 
    } 

這是正確的嗎?我有點擔心我可能會耗盡線程池,因爲線程正在通過產生一個新的Listen()調用而保持活動狀態。

回答

1

這是正確的嗎?我有點擔心我可能會耗盡線程池,因爲線程正在通過產生一個新的Listen()調用而保持活動狀態。

是的,這是完全正確,這種操作不CPU綁定,它的IO約束。因此,線程池中沒有任何被阻塞的線程等待操作完成。

有一個線程等待網絡請求完成,但它在所有網絡請求(如UI線程)之間共享。它在Windows上稱爲IO完成端口線程。當網絡請求完成時,操作系統中的中斷處理程序將作業添加到IO完成端口的隊列中。要執行1000個網絡請求,請求都會啓動,並且隨着響應到達,它們將由單個IO完成端口輪流處理。

+1

IO完成端口沒有線程「等待」IO完成。線程「等待」是一個正在使用的線程。重疊IO擁有自己的線程池,並在IO完成時使用其中一個線程。 –

+0

@PeterRitchie:謝謝你的評論,你能解釋一下這個東西嗎?好像我沒有深刻的理解。或者甚至你可以爲這個問題發佈另一個更正確的答案? –

+0

感謝您的回答。至少運行任務的線程還活着?當它被告知再次運行Listen()時,它爲什麼會死? – kasperhj