C# 在所述foreach中遵循异步/等待方法的线程foreach

C# 在所述foreach中遵循异步/等待方法的线程foreach,c#,C#,我一直在寻找一种通过具有多个线程的foreach进行数据传输的方法,例如,假设我有一个列表 public List<MYclass> All() { // fill the list } Private async Task Main() { foreach(All() as whatever) { await method(); await method2(); } } private async Task

我一直在寻找一种通过具有多个线程的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
}
public List All()
{
//填写清单
}
专用异步任务Main()
{
foreach(All()作为任意项)
{
等待方法();
等待方法2();
}
}
专用异步任务方法()
{
//做点什么
//更多的东西
等待另一个();
}
专用异步任务方法2()
{
//做点什么
//更多的东西
等待另一个2();
}
私有异步任务另一个()
{
//等待客户做任何事情
}
私有异步任务另一个2()
{
//等待客户做任何事情
}
我正在努力做到以下几点:

列表项1=thread1

列表项2=thread2

列表项3=thread3

…等等,取决于我有多少线程


我一直在毫无希望地四处寻找,我找到了Parrelell.foreach,但这并不等待等待,因为一旦它点击等待,它完成整个动作,然后再次启动foreach,那么我如何才能实现我想要的呢?任何帮助都将不胜感激。

首先要说的是,异步/等待代码并不是真正的。我认为它有时会创建另一个线程,但主要是为了减轻代码中的阻塞

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

现在“线程”的概念太低级了,无法考虑——毕竟,当一个方法正在等待时,它甚至不使用线程。相反,您要考虑“任务”和“操作”

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

private async Task ProcessAsync(MyClass item)
{
  await method();
  await method2();
}
接下来,要同时启动所有任务的操作,可以使用
选择

private async Task Main()
{
  var tasks = All().Select(ProcessAsync).ToArray();
}
然后,要(异步)等待它们全部完成,请使用
wait Task。whalll

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

方法完成所有工作后,是否继续执行
All
中的下一项?而不是
wait method()
,为什么不
任务。添加(方法())等,然后调用
等待任务。当所有(任务)