在閱讀 C# 中的多執行緒時(無論是從 MSDocs 還是像 Stephen Cleary 所著的 Concurrency in C# 這樣的書籍),我反復遇到的建議基本上歸結為:執行緒是舊的、低級別的并發性抽象,被 Task 和 Task< T> 類取代了。
現在我明白了,任務是更高層次的,功能更豐富、更強大的,而且幾乎可以做任何執行緒以前用于異步和并行的事情。
我的問題是:有沒有什么事情是執行緒可以做的,而較新的Task和Task<T>等不能做的,以便我花時間學習多執行緒,以防我遇到這些用例?
uj5u.com熱心網友回復:
由于你提到的所有原因,任務是很好的,而且它們可以重復使用池中的執行緒。這就避免了擁有大量執行緒的開銷(每個執行緒都需要一個堆疊,以及內核中的一些控制結構,跟蹤它們等等),也避免了任務切換的開銷--內核需要一些周期在執行緒之間轉換。如果你有很多執行緒在競爭同一個CPU,那么你將花費更多的時間來切換,而減少做實際作業的時間。
根據對您問題的評論之一,直接使用執行緒意味著您可以控制生命周期,我能想到的唯一其他東西是執行緒本地存盤(https://docs.microsoft.com/en-us/dotnet/standard/threading/thread-local-storage-thread-relative-static-fields-and-data-slots)。
uj5u.com熱心網友回復:
是的,你也需要學習執行緒的知識。如果你對多執行緒一無所知,下面是一份不完全的清單,你將無法做這些事情:
locks、SemaphoreSlims、Mutexes、Barriers、Countdowns等一無所知,你的并行和不同步的任務將破壞你的應用程式的非執行緒安全狀態。
Interlocked類,你將無法對你的任務所使用的變數和欄位進行原子突變。volatile關鍵字和Volatile類一無所知。
Task。
Task.ThreadPriority之外的執行緒上運行的Task。
ThreadLocal<T>)。對于學習多執行緒,這里有一個免費的在線資源。Threading in C# by Joseph Albahari.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/325311.html
標籤:
上一篇:如何使用vb.net禁用sapcrystalreports中的列印預覽?
下一篇:為什么FileAge回傳意外值?
