我一直在寻找通过多线程的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,所以我怎么能去实现我想要的?任何帮助都会有很大的帮助。
答案 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);
}