C 中的Task建立指南

2021-09-27 13:36:50 字數 2990 閱讀 8933

本文還處於草稿階段,難免還有錯誤修改改正,邏輯還不是很清晰,筆者會努力完善,長期更新!

標題起得有些"大",意在集大家的力量,總結出來乙份關於task相對"正確"的知識總結,歡迎讀者提出寶貴意見!本文內容來自於筆者在編碼的時候種種疑問,來自於對非同步程式設計在作業系統中實際執行過程的好奇。平時使用task戰戰兢兢,既想提高效率,又怕它不受控制,到處亂來。與其這樣,不如此時此刻一起來了解它神秘的面紗吧!just do it.

新型應用廣泛使用檔案和網路 i/o。 預設情況下 i/o api 一般會阻塞,導致糟糕的使用者體驗和硬體利用率,除非希望學習和使用富有挑戰的模式。 基於任務的非同步 api 和語言級非同步程式設計模型改變了這種模型,只需了解幾個新概念就可預設進行非同步執行。

非同步**具有以下特點:

.net 提供了執行非同步操作的三種模式:

基於事件的非同步模式 (eap) ,是提供非同步行為的基於事件的舊模型。 這種模式需要字尾為async的方法,以及乙個或多個事件、事件處理程式委託型別和eventarg派生型別。 eap 是在 .net framework 2.0 中引入的。 建議新開發中不再使用這種模式。 有關詳細資訊,請參閱基於事件的非同步模式 (eap)。

非同步程式設計模型 (apm) 模式(也稱為 iasyncresult 模式),這是使用 iasyncresult 介面提供非同步行為的舊模型。 在這種模式下,同步操作需要beginend方法(例如,beginwriteendwrite以實現非同步寫入操作)。 不建議新的開發使用此模式。 有關詳細資訊,請參閱非同步程式設計模型 (apm)。

為了快速比較這三種模式的非同步操作方式,請考慮使用從指定偏移量處起將指定量資料讀取到提供的緩衝區中的read方法:

public

class

myclass

此方法對應的 tap 將公開以下單個readasync方法:

public

class

myclass

對應的 eap 將公開以下型別和成員的集:

public

class

myclass

對應的 apm 將公開beginreadendread方法:

public

class

myclass

請一路async,否則會不可控。

網路請求,檔案讀寫時系統自帶的async方法不會建立多執行緒,而是使用完成埠,依靠中斷來實現!

執行緒池中的執行緒分為 workerthread 和 completionportthread .

平時我們使用的執行緒是workerthread,io讀寫使用的是completionportthread

以下**不會建立多個執行緒(workerthread),**會在當前執行緒工作,且不會堵塞哦。

執行起來非常類似同步程式, 使用await runactionasync(()=>{});

後,會立即執行程式

public task runactionasync(action action)

catch (exception ex)

source.setresult(task.completedtask);

return task;

}

以下**會建立新執行緒(workerthread),位於執行緒池,執行緒池預設最小workerthread為cpu核心數,completionportthread為1000(實際最小值依實際運**況而定,可手工修改)

執行時並不會立即執行action,按照預設執行計畫(taskscheduler.default執行,比如用for迴圈一堆task.run(async ()=> );

task.factory.startnew(_ =>

, null,

cancellationtoken.none,

taskcreationoptions.longrunning,

taskscheduler.default)

以下**.net core不支援哦,請使用task.factory.startnew代替

task.factory.fromasync(

new func((cb, obj) => action.begininvoke(biz, cb, obj)),

new action(ar => action.endinvoke(ar)), null)

the danger of taskcompletionsource class

了解 .net 的預設 taskscheduler 和執行緒池(threadpool)設定,避免讓 task.run 的效能急劇降低

.net 中小心巢狀等待的 task,它可能會耗盡你執行緒池的現有資源,出現類似死鎖的情況

.net 中使用 taskcompletionsource 作為執行緒同步互斥或非同步操作的事件

定義一組抽象的 awaiter 的實現介面,你下次寫自己的 await 可等待物件時將更加方便

.net 除了用 task 之外,如何自己寫乙個可以 await 的物件?

.net 中什麼樣的類是可使用 await 非同步等待的?

asynchronous i/o in c#: i/o completion ports

asynchronous i/o in c#: i/o completion ports

migrating delegate.begininvoke calls for .net core

C 中的Task建立指南

本文還處於草稿階段,難免還有錯誤修改改正,邏輯還不是很清晰,筆者會努力完善,長期更新!標題起得有些 大 意在集大家的力量,總結出來乙份關於task相對 正確 的知識總結,歡迎讀者提出寶貴意見!本文內容來自於筆者在編碼的時候種種疑問,來自於對非同步程式設計在作業系統中實際執行過程的好奇。平時使用tas...

Task中啟動task的風險分析

序 這兩天遇到乙個task中引數傳遞錯誤的問題,折騰了一天多,總算找到原因了,記錄之。設計思維 maintask是程式的主task,在 maintask 中重新建立新的task,呼叫關係 maintask 實際引數 位址 資訊 param 0x12a154 0x0 void taskastart i...

MTK平台學習 TASK的建立

分類 mtk平台 mtk平台是非常優秀的乙個平台,曾經的山寨機之父,下面我將介紹下在mtk平台下如何去建立自己的任務。一 基礎知識 在學習如何建立任務之前,我們需要了解一些基本概念,以及一些和任務相關的資料結構,了解了這些之後,我們就能更好的理解如何去建立任務了。mtk中關於任務的概念有兩個,乙個是...