From: 011netservice@gmail.com
Date: 2022-04-22
Subject: Thread and Task Samples
thread 跟 task 都能完成非同步工作, 以下列出各種組合的程式範例:
程式範例下載
目錄
啟動執行子執行緒或工作
使用狀態參數回傳結果
等候完成後, 再取用處理結果
系統排班執行
減輕系統負擔
取消執行
摘要
中英文對照
啟動執行子執行緒或工作
啟動執行子執行緒或工作, 若沒有使用狀態參數的話, 通常會改變共用資源的狀態(例如: 改變畫面上的某個欄位值), 完成處理結果:
注意: 使用共用資源, 就需要注意多工作業下同時使用的衝突問題. (解決方法例如: 以 Lock 控制同一時間只有一個執行緒鎖定使用中)
Thread1.cs
ThreadStart(Action).Start()
送出動作代理函數, 無傳入參數, 系統會回呼動作代理函數.
Task1.cs
Task(Action).Start()
送出動作代理函數, 無傳入參數, 系統會回呼動作代理函數.
使用狀態參數回傳結果
子執行緒或工作, 除了以共用資源回傳處理結果以外, 也可以狀態參數傳遞, 避免多工平行運算時, 發生同時取用共用資源的衝突.
Thread2
ParameterizedThreadStart(Action).Start(Parameter)
送出動作代理函數, 傳入參數, 系統會回呼動作代理函數.
Task2
Task(Action, Parameter).Start()
送出動作函數, 傳入參數, 系統會回呼動作代理函數.
等候完成後, 再取用處理結果
通常, 主執行緒只需要子執行緒或工作的運算結果, 而不需要處理過程. 因此可以透過封鎖主執行緒的方式, 等候子執行緒或工作結束後, 再取用子執行緒或工作的運算結果.
此外, Task 比 Thread 多一點功能: "Task 本身也可以回傳運算結果", 可以取代狀態參數回傳運算結果.
Thread3
Thread.Join() 封鎖主執行緒, 等候子執行緒結束.
Task3
Task.Wait() 封鎖主執行緒, 等候工作結束.
這裡會發現 Task 比 Thread 多一點功能: "Task 本身也可以回傳運算結果", 可以取代狀態參數回傳運算結果.
系統排班執行
透過系統排班的呼叫方式, 可由系統以 ThreadPool執行緒集區, 有效率的管理子執行緒(或工作)的執行作業, 降低系統負擔, 並簡化呼叫步驟.
Thread4
透過 BackgroundWorker 背景工作簡化呼叫子執行緒, 系統會以 ThreadPool 執行緒集區管理執行緒, 有效率的回呼(啟動與完成時的)代理函數.
Task4
Task.Run() 同樣可以簡化呼叫方式, 並使用 ThreadPool 降低系統負擔.
減輕系統負擔
透過 ThreadPool 及 Task.Factory 可以減輕系統負擔:
Thread5
執行緒集區 ThreadPool 可減輕系統負擔.
Task5
Task.Factory 可減輕系統負擔.
取消執行
Thread6
以共用資源控制取消執行緒.
注意: 使用共用資源, 就需要注意多工作業下同時使用的衝突問題. (解決方法例如: 以 Lock 控制同一時間只有一個執行緒鎖定使用中)
Task6
以 CancelationToken 控制取消工作, 比共用資源的方式更安全、更有效率.
摘要
Thread
1. 系統負擔較重. 每一個執行緒虛耗用 1MB 記憶體空間.
2. 使用完成後, .Net CLR Garbage Collection 垃圾回收功能需進行回收作業.
3. 處理結果透過改變(共用資源)或(狀態物件)完成. 共用資源須注意不同執行緒共用鎖定的情況. 狀態物件須在執行緒之間傳送資料.
Task
1. 微軟建議優先採用的非同步/多工程式開發方式.
2. Task.Run() 是 Task.Factory.StartNew() 的簡化版本, 以預設參數帶入, 可簡化複雜的使用方式.
Task.Run() 預設為:
(cancellation token) = CancellationToken.None.
(CreationOptions) = TaskCreationOptions.DenyChildAttach.
Uses the default task scheduler.
3. 處理結果除了透過改變(共用資源)或(狀態物件)以外, 還可以透過 Task 回傳處理結果.
中英文對照
Action: 動作. 無回傳值的代理函數.
Block: 封鎖.
Delegate: 代理/委派函數.
Function: 函數. 有回傳值的代理函數.
Synchronization: 同步化.
Task: 工作.
Task.Factory: 工作工廠? 或 工作集區.
Thread: 執行緒.
ThreadPool: 執行緒集區.
CancellationToken: 取消權杖.
Log
20200306, 011netservice@gmail.com, Create.
20200311, Honda, Add cancel samples..