简化Task foreach循环C#

时间:2018-08-07 13:15:04

标签: c# asynchronous foreach task

我有许多foreach循环,我在其中将项目添加到要继续执行的任务列表中。

我每个人都有以下布局,但是我觉得这很冗长,所以想看看是否有一种更简洁的方式来写这个?

我需要捕获每个DoTaskOnItem的所有错误并将其记录下来,然后继续执行其余的任务。

    private async Task DoListOfTasks(List<string> items)
    {
        List<Task> tasks = new List<Task>();
        foreach (var item in items)
        {
            var task = Task.Run(async () =>
            {
                try
                {
                    await DoTaskOnItem(item);
                }
                catch
                {
                    AddErrorMessage($"Error: {item}");
                }
            });

            tasks.Add(task);
        }

        await Task.WhenAll(tasks);
    }

1 个答案:

答案 0 :(得分:4)

这是您可以做的:

private Task DoListOfTasks(List<string> items)
{
    return Task.WhenAll(items.Select(item => Task.Run<Task>(async () =>
    {
        try
        {
            await DoTaskOnItem(item);
        }
        catch
        {
            AddErrorMessage($"Error: {item}");
        }
    })));
}

我将在DoTaskOnItem中移动异常处理,它将简化为:

private Task DoListOfTasks(List<string> items)
{
    return Task.WhenAll(items.Select(DoTaskOnItem));
}

在这一点上,方法DoListOfTasks太简单了,甚至都不需要。