假设我有一个任务列表,我想并行运行它们。但是我并不需要所有人都完成才能继续,我只能继续讲下去。以下代码等待所有任务继续进行。我有办法单独等待其他任务完成吗?
List<string>[] x = await Task.WhenAll(new Task<List<string>>[] { task1, task2 })
// when task1 finishes, I want to process the result immediately instead of waiting on task2.
提前致谢!
您可以改用Task.WhenAny。
Stephen Cleary的博客中的示例“被盗” :
var client = new HttpClient();
string results = await await Task.WhenAny(
client.GetStringAsync("http://example.com"),
client.GetStringAsync("http://microsoft.com"));
// results contains the HTML for whichever website responded first.
您绝对可以跟踪其他任务:
// supposing you have a list of Tasks in `myTasks`:
while( myTasks.Count > 0 )
{
var finishedTask = await Task.WhenAny(myTasks);
myTasks.Remove(finishedTask);
handleFinishedTask(finishedTask); // assuming this is a method that
// does the work on finished tasks.
}
您唯一需要注意的是:
返回的任务将始终以RanToCompletion状态结束,其结果设置为要完成的第一个任务。即使完成的第一个任务以“已取消”或“故障”状态结束,也是如此。
WhenAny Doks中的评论(我强调)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句