先總結一下 之前發展過程的要點
1: 為了保證多線程正確順序執行 線程同步
2:== 為了節省操作系統線程資源 線程池 異步 方式管理==
正常來講 使用這倆個要點 進行使用 多線程可以滿足開發使用需求
但是 新的問題產生了
那就是 多個異步操作 需要編寫大量的代碼 控制線程同步以及異步結果處理邏輯
為了 解決這種情況 ==Task ==來了
Task 也就是 TPL 任務并行庫 其實可以理解為 對這個 線程池異步方式一個更抽象的表達
一種隱藏細節的封裝,以任務的方式來 替代 異步操作線程之間的交互并且提供相應的api去使用
而大多數情況 對于程序開發而言 對于 線程異步處理具體實現是不需要關注的,關注的是業務的執行邏輯,也就是說 Task的目的很明確 封裝底層實現 讓程序員更關注業務邏輯層,只需要合理使用Task的方式 確保邏輯上的正確即可,而不是專注在異步操作線程大量代碼中
接下來 就是主要講如何使用Task 的 api
- 創建任務 不再是thread類的方式了 有專門的Task類 有3種創建 task.run() \task.factory.startnew()\new task().start()
正常來講這種方式創建的線程 都是 屬于 線程池 后臺線程 如果有 長時間操作的
也可以通過 Task.Factory.StartNew(() => TaskMethod(“長時間復雜操作單獨線程”), TaskCreationOptions.LongRunning); 來設置 單獨一個線程
也可以 task.RunSynchronously(); - 阻塞線程 之前通過 join 或者 鎖 信號量等 來線程同步 主線程或者子線程之間
task 的話 可以通過 task.result 來 代替join - 組合任務
task.ContinueWith 設置執行完之后執行操作
4.子線程中在創建子線程 必須在 運行時 就先創建 子線程并附加給 父子線程
5.取消任務 還是老方法 CancellationTokenSource cancle 然后 根據token.IsCancellationRequested 去判斷 值得注意的是 如果在 task start之前就有可能存在取消操作 所以需要 var Task = new Task(() => TaskMethod(“Task”, cts.Token), cts.Token); 底層任務傳遞一次取消標志,然后給任務構造函數再傳遞一次 那么在取消之后進行start 就會攔住報錯 異常 不會進行執行去影響