c#Task及其線程模型

###涉及概念mysql

SynchronizeContext 同步上下文redis

TaskScheduler 調度器sql

Task 任務緩存

一個Context 下有一個調度器,默認是 ThreadPool Scheduler 線程池調度器 ThreadPoolTaskScheduler安全

當向DefaultTask 調度器中Post Task的時候,Task會被調動到線程池中的某個WorkThread上去網絡

所以多個Task訪問數據存在線程安全的問題多線程

每一個Task執行須要將自身扔個調度器處理,一般兩種 ThreadPool 調度器和 SynchronizationContext 調度器異步

SynchronizationContext 調度器至關於提供了一個Hook點,能夠對任務的調度作一些處理async

SynchronizationContext 自己是線程局部變量,保證了Context和線程綁定線程

其默認實現,也是使用線程池來調度執行Task

要保證一個 SynchronizationContext 下全部任務沒有線程衝突,就須要重寫 SynchronizationContext 的Post方法

當調度器向其Post Task 來執行的時候,經過鎖,來確保當前沒有其它Task執行,來保證數據訪問的安全性

網絡應用程序中,很容易出現線程訪問問題,主要緣由:

1:網絡IO須要有線程處理

2:業務邏輯自己在其它線程中處理

3:業務邏輯async 異步方式,使用到了線程池調度

這些狀況就會致使多線程資源訪問的問題

解決方法:

1:根據Service 來劃分資源管理,一組資源同時只能有一個Task處理

2:狀態資源全局化,內存無緩存狀態,狀態都存儲在redis或者mysql之類的外部數據倉庫中,外部倉庫自身保證多線程數據安全

相關文章
相關標籤/搜索