在foreach

时间:2017-05-20 13:30:02

标签: c#

我一直在寻找通过多线程的foreach进行迭代的方法,例如,假设我有一个列表

public List<MYclass> All()
{
     // fill the list
}


Private async Task Main()
{
     foreach(All() as whatever)
    {
        await method();
        await method2();
    }
}

private async Task method()
{
     //do some stuff
     // more stuff
     await another();
}


private async Task method2()
{
     //do some stuff
     // more stuff
     await another2();
}

private async Task another()
{
     //await client to do whatever
}

private async Task another2()
{
     //await client to do whatever
}

我正在尝试执行以下操作:

  

列表项1 = thread1

     

列表项2 = thread2

     

列表项3 = thread3

     

...等取决于我有多少线程

我一直在四处寻找,没有希望,我找到了Parrellel.foreach,但是不等待等待,因为一旦它到达等待,它完成整个动作然后再次开始foreach,所以我怎么能去实现我想要的?任何帮助都会有很大的帮助。

2 个答案:

答案 0 :(得分:0)

首先要说的是,async / await代码并非真正official docs。我认为它有时会创建另一个线程,但它主要是为了减轻代码中的阻塞。

我倾向于认为混合多线程和异步实际上有点痛苦,因为异常处理有点难以预测。您最好使用Parallel foreach,并从方法调用定义中取消异步。或者只是在并行foreach中调用.Result来使代码同步执行。

答案 1 :(得分:0)

“线程”是一个过于低级的概念,无法思考这些天 - 毕竟,当一个方法是await时,它甚至不使用线程。相反,你想要考虑“任务”和“操作”。

在这种情况下,您需要的是异步并发(不是并行/线程并发)。首先,定义您希望为每个项目执行的(单个)操作:

private async Task ProcessAsync(MyClass item)
{
  await method();
  await method2();
}

接下来,要同时启动所有任务的操作,您可以使用Select

private async Task Main()
{
  var tasks = All().Select(ProcessAsync).ToArray();
}

然后,以(异步)等待所有这些完成,使用await Task.WhenAll

private async Task Main()
{
  var tasks = All().Select(ProcessAsync).ToArray();
  await Task.WhenAll(tasks);
}