2016-11-16 17 views
2

に一致するように配列内の最初のタスクを待ちます。最初のTasktrueを返したときに通知を受ける(待機する)にはどうすればよいですか?私は​​を持っている状態

答えて

9

基本的には、完了していないタスクが残っている場合は、Task.WhenAnyを繰り返し使用し、結果を確認して、結果が見つからない場合はそのタスクを削除してください。たとえば、次のように

ISet<Task<bool>> activeTasks = new HashSet<Task<bool>>(myTasks); 
while (activeTasks.Count > 0) 
{ 
    Task<bool> completed = await Task.WhenAny(activeTasks); 
    if (completed.Status == TaskStatus.RanToCompletion && 
     completed.Result) 
    { 
     // Or take whatever action you want 
     return; 
    } 
    // Task was faulted, cancelled, or had a result of false. 
    // Go round again. 
    activeTasks.Remove(completed); 
} 
// No successful tasks - do whatever you need to here. 
+0

'Task.WhenAny'の連続呼び出しは、我々は最初の有効な真のタスクを達成するまで、それは私が考えていたものだ、それを行うことができ、過負荷を見つけようとしますが、どれもありません、感謝して@Jonは素晴らしいソリューションです。 それにもかかわらず、なぜHashSetのは、我々は単に重複したタスクは、アレイ –

+0

@MrinalKambojに罰金であればどのような、配列を扱うことができます:あなたはすでにあなたに渡すコレクションからチェックした完了したタスクを削除できるようにする必要があります'WhenAny' - それ以外の場合は即座に戻り、同じタスクを再度実行します。配列から項目を削除することはできません。タスクが見つかり、Oを除去することができるように、私は 'HashSet'を使用して提案してきた(1)ではなくO(n)は、よりもののあなたは*ロット*タスクで、それとの違いを持っ​​ていない限り、'一覧>おそらく重要ではない。 –

+0

なぜTask.WhenAny(activeTasks);の後にcompleted.Status == TaskStatus.RanToCompletionをチェックしますか? lambaの拡張子などとしてうれしいですが、後でやり直してみるといいかもしれません。 – Milleu

関連する問題