[英]Async/await within BeginReceive Callback
有人說, BeginReceive
和BeginSend
回調不在.Net ThreadPool
上執行,而是在IOCP ThreadPool
上執行。 對於高性能服務器,至關重要的是IOCP線程盡快返回到池中,這意味着在BeginReceive
和BeginSend
的回調中不會增加任何BeginReceive
。 如果我調用異步方法並在回調中等待它該怎么辦? 這是否意味着IOCP
線程將返回線程池,並且異步操作完成時,回調方法將在另一個可用的IOCP
線程上繼續?
AFAIK,不能保證這些回調將在IOCP線程上執行。
如果使回調異步並使用await
,則回調線程將返回到線程池(無論是IOCP線程還是常規線程池線程)。 稍后,當異步方法恢復時,它將在常規線程池線程(而不是IOCP線程)上恢復(AFAIK未記錄,但很有意義)。
但是,我無法想象您實際想要這樣做的用例。 如果將BeginReceive
/ EndReceive
和BeginSend
/ EndSend
封裝在基於任務的API中,並且始終使用async
/ await
,則代碼將更BeginReceive
。
如果調用並await
async
方法,則將使用ThreadPool
線程執行繼續操作(除非由SynchronizationContext
或TaskScheduler
另行指定,此處不是這種情況)。
但是,除非使async void
,否則不能使回調async
。 因此,我看不到如何合理地await
此回調中的任何內容。
這將是簡單得多變換BeginX/EndX
成Task
與FromAsync
,然后你可以處理它延續更多的控制。 例如,您可以指定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.