私は複数の機能を並行して呼び出し、そのタスクにTPLを使用しています。私は私が実行されるすべての機能まで待つので、私はさらにプロセスのためにそれを使用できる同時辞書内のいくつかの結果を返す必要があり、今 リターンresutlに基づくTPLでの複数のタスクのキャンセル
ConcurrentDictionary<string, List<result>> dictionary = new ConcurrentDictionary<string, List<result>>();
var tasks = Task.Run(()=>
{
new Task(()=> {dictionary.TryAdd("First", CallFirstFunction());});
new Task(()=> {dictionary.TryAdd("Second", CallSecondFunction());});
new Task(()=> {dictionary.TryAdd("Third", CallThirdFunction());});
new Task(()=> {dictionary.TryAdd("Fourth", CallFourthFunction());});
});
を使用していた、しかし、いくつかが結果を返された場合、私はまた、任意のタスクをキャンセルしたいですタスクの順序に関係なく空です。関数が空の結果を返す場合、残りのすべてのタスクを同時にキャンセルする必要があります。私は "CancellationToken"クラスもチェックしましたが、私はタスクでこれを使用する方法とタスクで関数の状態を共有する方法を混同しています。
ご協力いただければ幸いです。 最高のお礼
結果が必要な場合は、それを待たなければなりません。 'Task.WaitAny'をチェックしてください –
なぜこれらのすべてのコールドタスクを作成していますか? 'new Task'の代わりに、' Task.Run'とCancellationTokenを使ってください。または、メインスレッドが完了するまでブロックしたくない場合は、[Parallel.Invoke](https://msdn.microsoft.com/en-us/library/dd783942(v=vs.110).aspx)を使用してください。 'Parallel.Invoke'はキャンセルトークンを受け入れることもできます。 –
@MikeDebelaブロックして待機する必要はありません。' await Task.WhenAll() 'は非同期で待機します –