2017-07-27 7 views
0

私は基本的に2つのプロデューサと1つのコンシューマ、2つのタスクがデータを書き、コンシューマはそれを読み込みます。私はSemaphoreまたはMutexまたはEventHandleをスレッド間の同期に使用できますが、新しいタスクベースのコードでは、これらのスレッドを使用することはできません。待機した後に同じスレッドで非同期関数が再開する保証はないためです。異なるタスク間でどのように同期する必要がありますか?タスク間で共有データのアクセスを同期させるにはどうすればよいですか?

+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これは部分的に非同期コードが自然に機能していることと、部分的には一般的に適用されている問題の種類に起因しています。多くの一般的なシナリオでは、スレッド化を使用してこれまで達成されていたことは、スレッド化なしで達成できるようになりました。 –

関連する問題