次の非同期キュー処理ルーティングがあります。
var commandQueue = new BlockingCollection<MyCommand>();
commandQueue
.GetConsumingEnumerable()
.ToObservable(new LimitedConcurrencyLevelTaskPoolScheduler(5))
.Subscribe(c =>
{
try
{
ProcessCommand(c);
}
catch (Exception ex)
{
Trace.TraceError(ex.ToString());
}
}
);
ある特定のシナリオ(データを取得しようとしているとき)では、外に出てデータを取得する前に、commandQueueが空であることを確認する必要があります。この操作は同期して行われることが期待されます。基本的にはこういうことをしたい
public void GetData()
{
commandQueue.WaitForEmpty();
// could potentially be expressed:
// while (commandQueue.Count > 0) Thread.Sleep(10);
return GoGetTheData()
}
理想的なシナリオでは、すべての呼び出し元が非同期で「GetData」を実行することを認識しています...ただし、同期して実行する必要がある場合もあります...したがって、一貫性を確保するためにコマンドキューが空になるのを待つ必要があります。私のデータの最新性。
ManualResetEventを使用してこれを非常に簡単に行う方法を知っていますが、System.Reactive/TPLを使用して簡単な方法があるかどうかを知りたいです。
ありがとう。