我在閱讀C# 5.0 in nutshell
,在閱讀作者的觀點後,我對我應該採用什麼感到困惑。我的要求是說,我有一個非常長的運行(計算繁重)任務,例如說,計算數百萬文件的SHA1(或其他)散列,或者真的任何其他事情是計算量很大並且可能需要一些時間,我應該如何開發它(如果有問題,請使用VS 2012,C#5.0),so that I can also report progress to the user
。PLINQ vs任務vs異步vs生產者/消費者隊列?要使用什麼?
以下情形(S)浮現在腦海中......
創建
Task
(與LongRunning
選項計算哈希值,並通過實施IProgess<T>
或Progess<T>
或報告進度,用戶要麼讓任務捕獲SynchronizationContext
上下文併發布到UI。創建一個
Async
方法,如async CalculateHashesAsync() { // await here for tasks the calculate the hash await Task.Rung(() => CalculateHash(); // how do I report progress??? }
使用TPL(或PLINQ)作爲
void CalcuateHashes() { Parallel.For(0, allFiles.Count, file => calcHash(file) // how do I report progress here? }
使用生產者/消費者隊列。
真的不知道如何?
書中的作者說...
運行在一個線程池一個長期運行的任務不會造成 麻煩。這是當你並行運行多個長時間運行的任務時 (特別是那些阻止)性能會受到影響的任務。在這種情況下 ,通常有更好的解決方案比 TaskCreationOptions.LongRunnging
- 如果任務IO約束,TaskCompletionSource和異步功能,讓你 實現併發性的回調,而不是線程。
- 如果任務是計算綁定的,則可以使用生產者/消費者隊列來限制這些任務的併發性,從而避免其他線程和進程的不足。
關於Producer/Consumer
作者說...
生產者/消費者隊列是一個有用的結構,無論是在並行編程 和一般的併發場景,因爲它給你精確 控制一次執行多少個工作線程,這不僅限制CPU消耗,還有其他資源。
那麼,我不應該使用任務,這意味着第一個選項出來了嗎?第二個是最好的選擇?還有其他選擇嗎?如果我是按照筆者的建議,並實現了一個生產者/消費者,我該怎麼做(我甚至不有一個如何與生產者/消費者在我的情況下開始的想法,如果那是最好的接近!)
我想知道是否有人曾經碰到過這樣的情況,他們會怎麼實現?如果沒有,什麼是性能最有效的和/或易於開發/維護(我知道這個詞performance
是主觀的,但我們只是認爲它的工作原理,並且效果很好的很一般情況下!)
你看着TPL數據流?它旨在使生產者/消費者代碼更易於編寫。 –
另外,從我現在看到的,沒有* *消費者這裏邊,只有*出品商*(計算哈希值),在那裏做這些哈希去以後呢? –
@PatrykĆwiek:保存到一個文件。那麼,你認爲我應該選擇2? – Razort4x