我想问你:我有代码:
var task1 = await _connectionService.ValidateUriAsync(uri1);
OutputResult("ss", task1);
var task2 = await _connectionService.ValidateUriAsync(uri2);
OutputResult("bb", task2);
var task3 = await _connectionService.ValidateUriAsync(uri3);
OutputResult("cc", task3);
现在我等到每个任务完成然后输出结果。但我想独立运行所有任务(我知道该怎么做)。但我不知道的是,当某项任务完成时,我需要为每项任务输出结果。如果任务失败,则输出将是 - task1失败或Task1成功。 我尝试了这个解决方案,但我必须检查哪个任务已完成,而不是结果(真/假)。这很复杂。如果我有100个任务,我就不能有100个条件。
var tasks = new[] {task1, task2, task3};
var process = tasks.Select(async task =>
{
var result = await task;
if(task == task1)assign property
});
await Task.WhenAll(proces);
修改 这是ValidateUriAsync func:
public async Task<bool> ValidateUriAsync(Uri uri)
{
try
{
var request = WebRequest.CreateHttp(uri);
var result = await request.GetResponseAsync();
return true;
}
catch (Exception e)
{
return false;
}
}
答案 0 :(得分:2)
当某项任务完成后,我需要为每项任务输出结果。
不要在完成任务时对这些事情做出反应。#34>。相反,将您的ValidateUriAsync
方法视为&#34;操作&#34;,您想要的是创建一个新的更高级别的操作&#34;那就是&#34;验证并分配&#34;。
凭借这种心态,解决方案更加清晰 - 为新操作引入新的async
方法:
private async Task ValidateAndOutputResult(Uri uri, string name)
{
var result = await _connectionService.ValidateUriAsync(uri);
OutputResult(name, result);
}
现在您可以调用更高级别的方法,并使用Task.WhenAll
:
var tasks = new[]
{
ValidateAndOutputResult(uri1, "ss"),
ValidateAndOutputResult(uri2, "bb"),
ValidateAndOutputResult(uri3, "cc"),
};
await Task.WhenAll(tasks);