2012-08-29 56 views
0

我有一個線程使用TcpClientBeginAcceptTcpClient()方法。它類似於:IAsyncResult開始/結束模式與取消

// this gets set elsewhere 
ManualResetEvent _doneListening = new ManualResetEvent(false); 

..和線程程序現在

while (true) 
{ 
    var result = BeginAcceptTcpClient(null, null); 

    var index = WaitHandle.WaitAny(new [] { _doneListening, result.AsyncWaitHandle }); 
    if (0 == index) 
    { 
     break; 
    } 

    // do something with EndAcceptTcpClient(result) 
} 

,根據MSDN文檔:

異步BeginAcceptTcpClient操作必須由 完成調用EndAcceptTcpClient方法。

我的問題涉及取消/停止情況下我的線程的 - 也就是說,_doneListening.Set()之後 - 我真的不希望有更多TcpClients。同時,我不想泄漏內存。

是否有必要調用EndAcceptTcpClient()?這將阻止,我當然不希望它(我想要一個快速的線程退出)。但是否會泄漏內存? MSDN暗示開始必須與End配對。我是否應該遵循不同的模式來有效取消潛在的進行中的異步操作?

回答

1

EndAcceptTcpClient將不會阻止,如果你關閉/處置TcpClient。所以當你完成了聽後關閉它。它會針對EndAcceptTcpClient拋出一個異常,但這沒關係。您可以放心地忽略/放棄該異常。

2

建議在開始/結束模式中調用End *方法。如果你沒有,那麼會有一些資源會「泄漏」。您應該致電TcpListener.Stop關閉聽衆,然後致電EndAcceptTcpClient

如果監聽器再次綁定,Stop可能會引發異常。所以,你可能需要檢查,或檢查IsBound(但檢查IsBoundStop你仍然可以得到一個新的綁定)...