2017-07-27 63 views
0

我使用.net核心和一些並行作品的任務,基本上它就像兩個生產者和一個消費者,兩個任務將寫入數據,消費者將讀取它,在tranditioanal .net代碼中,這些都是由線程完成的,我可以使用SemaphoreMutexEventHandle進行線程之間的同步,但是使用基於新任務的代碼時,我發現我不能再使用這些代碼,因爲不能保證異步函數將在await之後在同一個線程上恢復,所以我應該如何同步不同的任務?如何同步任務間共享數據的訪問?

+0

https://msdn.microsoft.com/library/system.threading.mutex(v=vs.110).aspx –

+0

即'Mutex.OpenExisting',你是什麼意思? – fluter

回答

2

我應該如何同步不同的任務?

既然你有一個生產者/消費者系統,你可以使用BufferBlock<T>,它作爲一個異步兼容的生產者/消費者隊列。

在更一般的協調原始替代的意義上,參見my AsyncEx.Coordination library。或者你可以build your own。內置到.NET的唯一一個是SemaphoreSlim

+0

好的,謝謝,我會嘗試AsyncEx,所有原始同步原語都在System.Threading中,並且在System.Threading.Tasks中沒有添加任何類似的東西,這是否意味着這種情況在TAP中很少見?或者當需要同步時,應該使用舊線程而不是任務? – fluter

+0

你最終需要不太經常與TAP同步。 IMO的這部分原因是由於異步代碼自然而然地起作用,部分原因是由於它通常適用的問題類型。在很多常見的場景中,以前用線程完成的工作現在可以在沒有它的情況下完成。 –