2.任務
3. 資源集合
public
static
void
asynthreadpool()
,"lambda state");
//閉包
system.threading.threadpool.
queueuserworkitem
(_ =
>
,"lambda state2");
sleep
(timespan.
fromseconds(2
));}
也可用cts.token 作為引數傳入非同步方法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()
;}
比執行緒池更抽象的概念,可以通過執行緒或不通過執行緒實現併發操作。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"
);
cancellationtoken 可以直接傳入task匿名函式中,為什麼重寫task函式,將cancellationtoken 作為引數傳入?// 利用 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)
因為當任務開始前,取消標誌位為已取消狀態,通過引數傳遞,會在task.start()執行時得到invalidoperationexception異常。而task操作中呼叫cancellationtoken , 是巡檢在任務執行過程中, cancellationtoken 時候置為取消狀態。
這是任務較於執行緒池具有優勢的地方,採用task.whenall()等待所有任務執行完畢後,執行下乙個操作;public
task
(func function,
cancellationtoken cancellationtoken)
;
採用task.whenany(),等待任意乙個任務完成或由於超時而結束後,執行下乙個操作。此處,可以借助取消標誌位一起,優化任務執行超時的問題。
採用taskcreationoptions.longrunning, 提議taskscheduler(任務排程程式)避免使用池化執行緒首席執行官時間的計算密集型操作。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 =
>
);
《果殼中的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...