次のように動作するキーを使用してタスクを実装するための最良のアプローチは何ですか?
オプション 1) このキーの 1 つだけが保留中です。たとえば、ASP.NET MVC から使用して、画像の URL が何回ヒットしても、サムネイル画像の単一のレンダリングをキューに入れることができます。1 つのみが実行され、他のすべての要求はその要求が完了するまで待機します。
オプション 2) 同じキーを持つすべての項目を順番に実行する必要があります。たとえば、バッキング ストアからローカル キャッシュにファイルをフェッチする操作がすべて同時にファイルをキャッシュに取得しようとしないようにするために使用できます。オプション 1 は、同じキーを持つ後続のアクションが単純に破棄される特殊なケースです (通常、ファイルの存在チェックのみを保存します)。
これらのケースの両方を処理する既存の WorkQueue があります (アパートメント状態、ThreadPriority 設定、および最大並列度も同様です)。TPL は、これを置き換えるための最良のソリューションと思われ、改善されたキャンセル オプションを提供します。
継続を伴うネストされたタスクは有望に見えますが、現在キューに入れられているタスクのディクショナリを維持することはすぐに、TaskFactory クラスと TaskScheduler クラスの間で面倒になります。TaskFactory も TaskScheduler も Task ではジェネリックではないため、Task からの継承にも問題があります。
ほとんどのタスク並列の例では、一連のタスクが事前にわかっていることを前提としています。この場合、新しいタスクが常に追加され、要求された操作と渡されたキーに応じて、破棄するか、既存のタスクにチェーンする必要があります。
TPL を使用してこれに似たものを実装した人はいますか? もしそうなら、Task、TaskScheduler、および TaskFactory クラスでどのようなアプローチを取りましたか?