は、私は、タスクのカップルを持っていると言うことができます。だから、基本的な解決策のようなもの書くことです:正常に終了した最初のタスクを取得するデフォルトの方法はありますか?</p> <pre><code>void Sample(IEnumerable<int> someInts) { var taskList = someInts.Select(x => DownloadSomeString(x)); } async Task<string> DownloadSomeString(int x) {...} </code></pre> <p>は、私が最初に成功したタスクの結果を得るためにしたい:
var taskList = someInts.Select(x => DownloadSomeString(x));
string content = string.Empty;
Task<string> firstOne = null;
while (string.IsNullOrWhiteSpace(content)){
try
{
firstOne = await Task.WhenAny(taskList);
if (firstOne.Status != TaskStatus.RanToCompletion)
{
taskList = taskList.Where(x => x != firstOne);
continue;
}
content = await firstOne;
}
catch(...){taskList = taskList.Where(x => x != firstOne);}
}
をしかし、この解決策はN
+(N
-1)+ ... + K
タスクを実行しているようです。 N
がsomeInts.Count
とK
の場合は、タスクの中で最初に成功したタスクの位置です。したがって、WhenAnyによって取得されたタスク以外のすべてのタスクが再実行されます。 したがって、実行中の最大数がN
のタスクで正常に終了した最初のタスクを取得する方法はありますか?最初の1が正常に終了したときにあなたがする必要があるのは、TaskCompletionSource
を作成してタスクのそれぞれに継続を追加し、それを設定されている
タスクを並行して実行するのではなく、並行して実行したいと思うようです。 –
あなたがそれらを並行して実行したいなら、 'var taskList = someInts.Select(x => DownloadSomeString(x)).ToList()'がうまくいくはずです。 –
それらを順番に実行したい場合は、単純な 'for'ループがジョブを実行する必要があります。 –