タスクで使用される BlockingCollection を使用した標準のプロデューサー コンシューマー実装があります。
アイテムの消費は、ブロッキング コレクションで GetConsumingEnumerable() を使用して行われ、各タスクはコンシューマー スレッドで RunSynchronously() を使用して実行されます。
これは私たちにとってはうまくいきますが、かなり短命ではなく、いくつかのタスクがバックエンド Web サービスと通信するようになります。
問題は、長時間実行されるアクティビティを実行するタスクをこの方法で実行することは許容できるか、それともより多くのリソースを消費し、代わりに継続を使用するようにブロック コレクションから取得するループを何らかの方法で調整する必要があるかということです。ループ内になかったら、この種の操作には常に継続を使用していました。
現在のコードは次のようになります
foreach(var task in _Queue.GetConsumingEnumerable())
{
if (!task.IsCanceled)
{
task.RunSynchronously();
}
}
私たちが対象としているプラットフォームを考えると、async await の使用は問題外です。