2012-09-30 140 views
1

我正在C#中編寫一個TCP服務器,並且我正在使用BeginXXX和EndXXX方法進行異步通信。如果我理解正確,當我使用BeginXXX時,請求將在線程池中處理(當請求準備就緒時),同時主線程繼續接受新連接。BeginXXX和線程池

問題是如果我在其中一個AsyncCallbacks中執行阻止操作會發生什麼?作爲任務運行阻塞操作會更好嗎?任務也使用線程池,不是嗎?

用例是:

主線程設置窗口偵聽套接字,其接受使用BeginAccept連接,並開始監聽使用BeginReceive這些連接。當收到完整的消息時,根據消息的內容調用函數,在所有情況的80%中,這些函數將啓動數據庫查詢/插入/更新。

回答

1

問題是如果我在其中一個AsyncCallbacks中執行阻止操作會發生什麼?作爲任務運行阻塞操作會更好嗎?

如果你經常這樣做或太長時間,ThreadPool將會增長。可能會導致應用程序崩潰。

所以儘量避免阻塞。但有一點它應該是可以接受的。請記住,ThreadPool將每500毫秒增加1個新線程。因此,請確保並驗證它將在一些合理數量的線程上平整。

鈍器可能會限制池的MaxThreads。

任務使用線程池也不是嗎?

是的,所以你的選擇是有限的。

+0

開始哼確定。在這種情況下,阻止操作將是一個數據庫查詢,但我想這在大多數情況下會低於500ms :) –

+0

爲什麼不異步查詢數據庫? – fsimonazzi

+0

不會異步查詢也使用線程池? –

2

我建議你使用它在.NET 4.5

介紹這裏的一些閱讀材料的SocketAsyncEventArgs你可以用

click me

+0

那又如何解決數據庫查詢? –

+0

您需要查詢數據庫的哪部分代碼?請問可以說明邏輯嗎? – Larry

+0

將該用例添加到問題中。 Upvoted爲良好的閱讀材料。儘管在切換到SocketAsyncEventArgs之前,我可能會使用BeginXXX方法,直到它們成爲瓶頸,因爲BeginXXX方法實現起來更容易。 –