簡體   English   中英

在BeginReceive回調中進行異步/等待

[英]Async/await within BeginReceive Callback

有人說, BeginReceiveBeginSend回調不在.Net ThreadPool上執行,而是在IOCP ThreadPool上執行。 對於高性能服務器,至關重要的是IOCP線程盡快返回到池中,這意味着在BeginReceiveBeginSend的回調中不會增加任何BeginReceive 如果我調用異步方法並在回調中等待它該怎么辦? 這是否意味着IOCP線程將返回線程池,並且異步操作完成時,回調方法將在另一個可用的IOCP線程上繼續?

AFAIK,不能保證這些回調將在IOCP線程上執行。

如果使回調異步並使用await ,則回調線程將返回到線程池(無論是IOCP線程還是常規線程池線程)。 稍后,當異步方法恢復時,它將在常規線程池線程(而不是IOCP線程)上恢復(AFAIK未記錄,但很有意義)。

但是,我無法想象您實際想要這樣做的用例。 如果BeginReceive / EndReceiveBeginSend / EndSend封裝在基於任務的API中,並且始終使用async / await ,則代碼將更BeginReceive

如果調用並await async方法,則將使用ThreadPool線程執行繼續操作(除非由SynchronizationContextTaskScheduler另行指定,此處不是這種情況)。

但是,除非使async void ,否則不能使回調async 因此,我看不到如何合理地await此回調中的任何內容。

這將是簡單得多變換BeginX/EndXTaskFromAsync ,然后你可以處理它延續更多的控制。 例如,您可以指定TaskScheduler.Defaul t以確保繼續在ThreadPool線程上運行。

var task = Task.Factory.FromAsync(BeginX, EndX,...);
task.ContinueWith(ante => {...}, null, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.Default)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM