C 多執行緒學習 (一) 執行緒池VS任務

2021-09-02 22:32:59 字數 3683 閱讀 8649

2.任務

3. 資源集合

public

static

void

asynthreadpool()

,"lambda state");

//閉包

system.threading.threadpool.

queueuserworkitem

(_ =

>

,"lambda state2");

sleep

(timespan.

fromseconds(2

));}

static

void

main

(string

args));

system.threading.threadpool.

queueuserworkitem

(_=>

console.

writeline

("sleep 1000s, thread isn't cancel");

}); system.threading.threadpool.

queueuserworkitem

(_ =

>

console.

writeline

("sleep 100s, thread isn't cancel");

}); system.threading.threadpool.

queueuserworkitem

(_ =

>

console.

writeline

("thread isn't cancel");

}); thread.

sleep(10

);cts.

cancel()

; console.

readline()

;}

也可用cts.token 作為引數傳入非同步方法

比執行緒池更抽象的概念,可以通過執行緒或不通過執行緒實現併發操作。task 概念由 .net framework4.0 引入,是並行程式設計庫(task parallel library,簡稱 tpl)的一部分。

task 是可組合的—利用延續,可同時啟動多個任務,待所有任務執行完畢後,啟動另乙個任務處理之前任務的結果。

task.

run(()

=>);

var task2 =

newtask((

)=> console.

writeline

("start task"))

;task2.

start()

;task.factory.

startnew((

)=> console.

writeline

("start task"))

;

var task = task.

run(()

=> console.

writeline

("start task"))

;//顯式阻塞當前執行緒,等待task執行完畢

task.

wait()

;

task t =

newtask

<

int>

(n =

>

return result;},

100000);

console.

writeline

($"task has started!");

t.start()

;//阻塞當前執行緒,等待任務返回結果

console.

writeline

($"task result is ");

console.

writeline

($"current thread has been blocked"

);

// 利用 cancellationtokensource 作為取消標誌,取消任務。

cancellationtokensource cts =

newcancellationtokensource()

;task t =

newtask

<

int>((

)=>

return result;})

;console.

writeline

($"task has started!");

t.start()

;thread.

sleep(10

);console.

writeline

($"cts has been canceled");

cts.

cancel()

;try")

;}catch

(aggregateexception ex)

cancellationtoken 可以直接傳入task匿名函式中,為什麼重寫task函式,將cancellationtoken 作為引數傳入?

因為當任務開始前,取消標誌位為已取消狀態,通過引數傳遞,會在task.start()執行時得到invalidoperationexception異常。而task操作中呼叫cancellationtoken , 是巡檢在任務執行過程中, cancellationtoken 時候置為取消狀態。

public

task

(func function,

cancellationtoken cancellationtoken)

;

這是任務較於執行緒池具有優勢的地方,採用task.whenall()等待所有任務執行完畢後,執行下乙個操作;

採用task.whenany(),等待任意乙個任務完成或由於超時而結束後,執行下乙個操作。此處,可以借助取消標誌位一起,優化任務執行超時的問題。

var task1 = task<

string

>

.run((

)=>);

var task2 = task<

string

>

.run((

)=>);

var task3 = task.

whenall

(new

);task3.

continuewith

(t3 =

>

-- are all done !");

});var task4 = task.

whenany

(new

);task4.

continuewith

(t4 =

>

);

採用taskcreationoptions.longrunning, 提議taskscheduler(任務排程程式)避免使用池化執行緒首席執行官時間的計算密集型操作。

《果殼中的c#》《clr via c#》《c#多執行緒程式設計實戰》

14.併發與非同步 - 3.c#5.0的非同步函式 -《果殼中的c#》

c# 5.0 async函式的提示和技巧

C 多執行緒操作(一) 執行緒與執行緒池

c 中可以直接操作thread物件來操作執行緒 具體 實現如下 class program 這種方式執行緒會輪流執行,而不是執行完乙個再開始執行另外乙個 console.readkey public static void dowork endregion c 中為了解決執行緒頻繁建立帶來的效能開銷...

C 多執行緒(一) 執行緒管理

多執行緒是 此處省略一萬字,省略的文字詳細說明了什麼是多執行緒 其歷史及其發展 使用多執行緒的好處和缺點以及c c 對多執行緒的支援的歷史 c 標準庫自c 11標準以來開始支援多執行緒,多執行緒相關的類在thread標頭檔案中,所以使用請先必須 include 啟動乙個執行緒非常簡單,例程如下 in...

執行緒池系列 一 執行緒池簡介

執行緒池主要解決了倆個問題 一是避免了頻繁建立銷毀執行緒所帶來的開銷,達到了執行緒復用的目的 二是執行緒池提供了一種資源限制和管理的手段,使用者可以通過一些引數來定製化執行緒 public class threadpoolexecutor extends abstractexecutorservic...