公司的自動化測試平台是 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();
取消任務的話,需要乙個cancellationtokensource
的token
來取消即可。
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,將初始化的 ...