需要帮助将其转换为lamdba表达式,我可以使用Task.WhenAll:
public void DoWork(string id)
{
var items = GetItems(id); //takes time
if (items == null)
{
return;
}
Parallel.ForEach(items, item =>
{
DoSomething(item); //takes time
DoWork(item.subItemId);
});
}
我想使用lambda表达式将Parallel For循环更改为任务,如Martin在此主题中的回答所示: How to call an async method from within a loop without awaiting?
不确定如何在item =>之后指定多行。这似乎不起作用:
public void DoWork(string id)
{
var items = GetItems(id); //takes time
if (items == null)
{
return;
}
var tasks = items.Select(item =>
{
DoSomething(item)
DoWork(item.subItemId)
});
await Task.WhenAll(tasks);
}
更新:
谢谢大家的回答。如果我有if条件,我会浪费任务吗?有没有更好的代码?我需要使用Where而不是吗?
var tasks = items.Select(async item =>
{
if (item.HasWork)
{
await DoSomethingAsync(item);
await DoWorkAsync(item.subItemId);
}
});
await Task.WhenAll(tasks);
答案 0 :(得分:7)
最简单的方法是使用async
lambda:
public async Task DoWorkAsync(string id)
{
var items = GetItems(id); //takes time
if (items == null)
return;
var tasks = items.Select(async item =>
{
await DoSomethingAsync(item);
await DoWorkAsync(item.subItemId);
});
await Task.WhenAll(tasks);
}
Martin's original answer假设您编写自己的async
方法而不是async
lambda,这可能会使代码更清晰:
public async Task DoWorkAsync(string id)
{
var items = GetItems(id); //takes time
if (items == null)
return;
var tasks = items.Select(item => ProcessAsync(item));
await Task.WhenAll(tasks);
}
private async Task ProcessAsync(T item)
{
await DoSomethingAsync(item);
await DoWorkAsync(item.subItemId);
}