From: 011netservice@gmail.com
Date: 2022-04-22
Subject: Thread and Task Samples

thread 跟 task 都能完成非同步工作, 以下列出各種組合的程式範例:
程式範例下載

目錄

啟動執行子執行緒或工作
使用狀態參數回傳結果
等候完成後, 再取用處理結果
系統排班執行
減輕系統負擔
取消執行
摘要
中英文對照

啟動執行子執行緒或工作

啟動執行子執行緒或工作, 若沒有使用狀態參數的話, 通常會改變共用資源的狀態(例如: 改變畫面上的某個欄位值), 完成處理結果:

注意: 使用共用資源, 就需要注意多工作業下同時使用的衝突問題. (解決方法例如: 以 Lock 控制同一時間只有一個執行緒鎖定使用中)

Thread1.cs

ThreadStart(Action).Start()
送出動作代理函數, 無傳入參數, 系統會回呼動作代理函數.
alt

Task1.cs

Task(Action).Start()
送出動作代理函數, 無傳入參數, 系統會回呼動作代理函數.
alt
目錄

使用狀態參數回傳結果

子執行緒或工作, 除了以共用資源回傳處理結果以外, 也可以狀態參數傳遞, 避免多工平行運算時, 發生同時取用共用資源的衝突.

Thread2

ParameterizedThreadStart(Action).Start(Parameter)
送出動作代理函數, 傳入參數, 系統會回呼動作代理函數.
alt
目錄

Task2

Task(Action, Parameter).Start()
送出動作函數, 傳入參數, 系統會回呼動作代理函數.
alt
目錄

等候完成後, 再取用處理結果

通常, 主執行緒只需要子執行緒或工作的運算結果, 而不需要處理過程. 因此可以透過封鎖主執行緒的方式, 等候子執行緒或工作結束後, 再取用子執行緒或工作的運算結果.
此外, Task 比 Thread 多一點功能: "Task 本身也可以回傳運算結果", 可以取代狀態參數回傳運算結果.

Thread3

Thread.Join() 封鎖主執行緒, 等候子執行緒結束.
alt

Task3

Task.Wait() 封鎖主執行緒, 等候工作結束.
這裡會發現 Task 比 Thread 多一點功能: "Task 本身也可以回傳運算結果", 可以取代狀態參數回傳運算結果.
alt
目錄

系統排班執行

透過系統排班的呼叫方式, 可由系統以 ThreadPool執行緒集區, 有效率的管理子執行緒(或工作)的執行作業, 降低系統負擔, 並簡化呼叫步驟.

Thread4

透過 BackgroundWorker 背景工作簡化呼叫子執行緒, 系統會以 ThreadPool 執行緒集區管理執行緒, 有效率的回呼(啟動與完成時的)代理函數.
alt

Task4

Task.Run() 同樣可以簡化呼叫方式, 並使用 ThreadPool 降低系統負擔.

alt
目錄

減輕系統負擔

透過 ThreadPool 及 Task.Factory 可以減輕系統負擔:

Thread5

執行緒集區 ThreadPool 可減輕系統負擔.
alt

Task5

Task.Factory 可減輕系統負擔.
alt
目錄

取消執行

Thread6

以共用資源控制取消執行緒.
注意: 使用共用資源, 就需要注意多工作業下同時使用的衝突問題. (解決方法例如: 以 Lock 控制同一時間只有一個執行緒鎖定使用中)
alt

Task6

以 CancelationToken 控制取消工作, 比共用資源的方式更安全、更有效率.
alt
目錄


摘要

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..

WebTool