任务完成时分配属性

时间:2017-07-03 11:38:10

标签: c# wpf multithreading task-parallel-library

我想问你:我有代码:

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;
        }
    }

1 个答案:

答案 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);