使用lambda表达式将Parallel.ForEach循环转换为并行任务

Pra*_*bhu 0 .net c# linq asynchronous async-await

需要帮助将其转换为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);                    
       });           
}
Run Code Online (Sandbox Code Playgroud)

我想使用lambda表达式将Parallel For循环更改为任务,如Martin在此主题中的回答中所建议的: 如何在循环中调用异步方法而不等待?

不确定如何在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);         
}
Run Code Online (Sandbox Code Playgroud)

更新:

谢谢大家的答案.如果我有if条件,我会浪费任务吗?有没有更好的代码?我需要使用Where而不是吗?

var tasks = items.Select(async item => 
{ 
    if (item.HasWork)
    {
       await DoSomethingAsync(item);
       await DoWorkAsync(item.subItemId);
    }
});      

await Task.WhenAll(tasks);  
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 7

使用asynclambda 最简单:

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);         
}
Run Code Online (Sandbox Code Playgroud)

Martin的原始答案假定您编写自己的async方法而不是asynclambda,这可能会使代码更清晰:

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);
}
Run Code Online (Sandbox Code Playgroud)