[英]Converting a Parallel.ForEach loop into parallel tasks using lambda expression
需要帮助将其转换为可以使用Task.WhenAll的lamdba表达式:
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表达式中的建议在Lambda表达式中将Parallel For循环更改为任务: 如何在不等待的情况下从循环中调用异步方法?
不知道如何在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);
使用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的原始答案假设您将编写自己的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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.