我有一個使用BeginRead/EndRead異步I/O範例實現套接字服務器的.NET Windows服務。現在這個套接字代碼需要調用一些async/Task /等待異步代碼。當您使用Task.Run時,會發生什麼情況以致線程池耗盡?
我一直在使用Nito.AsyncEx庫的AsyncContext類'運行方法,但我對是否阻止EndRead進行調用並保留工作線程人質持保留態度。我得到的建議是my earlier question是使用Task.Run而不是Nito.AsyncEx的AsyncContext.Run。這將調用提交到異步/等待代碼並立即返回。我想到,在負載情況下,客戶端不會阻止請求淹沒線程池。
我會重新問我關於Nito.AsyncEx的AsyncContext.Run的原始問題:它是否保存它被調用的線程(池線程調用我的套接字的EndRead回調)人質,還是釋放該線程它調用的異步I/O發生在後臺?
如果Nito.AsyncEx的AsyncContext.Run真的阻塞,那麼Task.Run似乎是我唯一的選擇。有關如何阻止客戶端請求以防止線程池耗盡的任何建議?
套接字服務器是少數和高吞吐量客戶端的低開銷需求。我們還支持HTTP,並且該代碼使用HttpTaskAsyncHandler,因此我不擔心可擴展性,並且具有更低吞吐量要求的客戶端。使用AsyncContext.Run不會爲我們的許多請求類型推回客戶端(它們會自己開始/結束......)。我對客戶端推遲的擔憂是沒有根據的擔心......我們正在控制誰連接到我們的套接字服務器。 Task.Run應該沒問題。 –