[英]Asynchronous methods(!) clarification in .net?
我最近已經閱讀了很多有關該主題的文章,但仍然需要澄清一些內容
異步方法的整體思想是線程經濟 :
允許許多任務在幾個線程上運行。 這是通過使用硬件驅動程序在將線程釋放回線程池的同時執行該作業來完成的,以便它可以處理其他作業。
請注意 。
我不是在談論綁定另一個線程的異步委托 ( 與調用者並行執行任務 )。
但是,我已經看到2種主要類型的異步方法示例:
僅使用現有 I / O異步操作作為beginXXX / endXX
例如Stream.BeginRead
)的代碼示例(來自書籍)。
而且我找不到任何不使用現有 .net I / O操作的異步方法示例,例如Stream.BeginRead
)
題 :
異步方法是否僅與.net I / O現有方法(例如BeginXXX , EndXXX
?
我的意思是,如果我想創建自己的異步方法,例如BeginMyDelay(int ms,...){..} , EndMyDelay(...)
。 我不能在沒有阻塞線程的情況下完成它。
非常感謝你。
ps請注意,此問題標記為.net 4而不是.net4.5
您在談論APM 。 APM廣泛使用OS概念,即IO完成端口 。 這就是為什么不同的IO操作是使用APM的最佳人選的原因。
您可以編寫自己的APM方法。 但是,實際上,這些方法將基於現有的APM方法,或者將與IO綁定,並且將使用某些本機OS機制(例如FilesStream
,它使用重疊的文件IO)。
IMO,對於計算綁定的異步操作,僅APM會增加復雜性。
多一點澄清。
本質上,使用硬件是異步的。 硬件需要一定時間來執行請求-內存卡必須發送或接收數據,硬盤必須讀/寫等。如果IO是同步的,則生成IO請求的線程正在等待響應。 APM在這里有幫助-您不應該等待,僅執行其他操作,當IO完成后,我會打電話給您,APM說。
要點-操作在CPU外部執行。
當您編寫任何計算綁定的操作時,它將使用CPU來執行它而沒有任何IO,這里沒有什么可等待的。 因此,APM毫無幫助-如果您需要CPU,則需要線程-您需要線程池。
我認為,但我不確定,您可以創建自己的異步方法。 例如,創建一個新線程並等待它完成一些工作(db查詢等)。
就總體系統性能而言,它可能沒有用,因為您只是說創建了另一個線程。 但是例如,如果您使用IIS,則在等待“后台”操作時,原始請求線程可用於其他請求。
我認為IIS具有固定數量的線程(線程池),因此在這種情況下會很有用。
我的意思是,如果我想創建自己的異步方法,例如BeginMyDelay(int ms,...){..},EndMyDelay(...)。 我不能在沒有阻塞線程的情況下完成它。
雖然我還沒有深入研究異步的實現,但我看不出任何無法做到這一點的原因。
最簡單的方法是使用幫助[例如計時器]或某種事件系統IIRC的現有庫。
但是,即使您不想使用任何庫幫助程序,也仍然會遇到問題……“阻塞線程”。
確保代碼確實如下所示:
while (true){
foreach (var item in WaitingTasks)
if (item.Ready())
/*fire item, and remove it from tasks*/;
/*Some blocking action*/
}
事實是-“某些阻止動作”不必一定是“阻止”。 您可以讓/休眠線程,或使用它來處理一些數據。 例如,Unity游戲引擎對協程做了類似的事情-處理所有代碼的同一個線程還會檢查是否需要更新各種(由於時間而延遲)的協程。 用ProcessGameLoop()替換/ *一些阻止動作* /。
e頭有幫助,隨時問問題/發布更正等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.