C 多執行緒任務 Task

2022-03-08 07:50:35 字數 1888 閱讀 8055

公司的自動化測試平台是 c# 語言的,因此有幸學習下 c#。

搜尋到的是這篇文章,是乙個**的,由淺入深。主要講的是task,裡面也有demo,非常詳細。

thread預設為前台執行緒,也可以設定為後台執行緒,主程式必須等待執行緒執行完畢後才可退出程式。開啟乙個新執行緒,執行緒不做任何操作,都要消耗1m左右的記憶體,所以是偽多執行緒,感覺就是在乙個cpu上乙個乙個的執行,和之前的順序有差別。

更多資料參考官方的

threadpoll是執行緒池 其目的是為了減少開啟新執行緒消耗的資源(使用執行緒池中的空閒執行緒,不必在開啟新執行緒,以及統一管理執行緒(執行緒池中的執行緒執行完畢後,回歸到執行緒池裡,等待新任務).

總結:threadpoll效能優於thread,但是thread和threadpoll對執行緒的控制都不是很好,例如執行緒等待(執行緒執行一段時間無響應後,直接停止執行緒,釋放資源 等 都沒有直接的api來控制 只能通過硬編碼來實現,同時threadpool使用的是執行緒池全域性佇列,全域性佇列中的執行緒依舊會存在競爭共享資源的情況,從而影響效能。

task的背後的實現也是使用了執行緒池執行緒,但它的效能優於threadpoll,因為它使用的不是執行緒池的全域性佇列,而是使用的本地佇列,使執行緒之間的資源競爭減少。同時task提供了豐富的api來管理執行緒、控制。但是相對前面的兩種耗記憶體,task依賴於cpu對於多核的cpu效能遠超前兩者,單核的cpu三者的效能沒什麼差別。

官方資料文件

建立乙個task也有3種方式來操作,task.factory.startnew()task run()new task(), 前面2種是一樣的,不需要用start來開始執行,後面一種需要start來執行的。

需要注意的是,start()後,並不是立即執行的。

task t = task.factory.startnew( () => 

console.writeline("finished loop iterations",

ctr);

} );

new 乙個

var task1 = new task(() =>

);task1.start();

取消任務的話,需要乙個cancellationtokensourcetoken來取消即可。

var tokensource = new cancellationtokensource();

var token = tokensource.token;

var task = task.factory.startnew(() =>

}}, token);

tokensource.cancel();

特別需要注意的是,這個task開始後,並不是立即執行的,因此後面需要這個task裡面的值或者其他東西的話,需要檢測其狀態或者其他值。

C 多執行緒六之Task 任務 二

前面介紹了task的由來,以及簡單的使用,包括開啟任務,處理任務的超時 異常 取消 以及如果獲取任務的返回值,在回去返回值之後,立即喚起新的執行緒處理返回值 且如果前面的任務發生異常,喚起任務如果有效的處理異常等關於task的知識。所以本文將介紹task更多的用法和特性.一 如果通過乙個任務建立多個...

C 多執行緒任務同步

首先建立全域性變數 int count 0 object monitorobject new object 建立兩個任務 public void task01 public void task02 控制台程式啟動多執行緒,並列印count的值 task t1 task.run task01 task...

C 多執行緒之thread與task

最近有個用c 開發的winform軟體,需要呼叫matlab匯出的dll檔案。最開始把dll中類的初始化放在了主窗體的建構函式裡面,結果軟體開啟30多秒才顯示介面。由於dll不是本人寫的,沒法改,只能在c 程式上想辦法。兩個方案 使用timer,在主窗體的load事件裡面觸發timer,將初始化的 ...