我有许多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);
}
答案 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
太简单了,甚至都不需要。