[英]Tasks in parallel using C#. Am I doing this right?
我已经搜索并阅读了,我只是想确定我是否正确。 我想并行运行三种方法,我想确保在继续之前完成所有方法。 它们都是异步的,并且此代码位于异步方法中。 我已经这样做了:
public async ProcessBegin() {
//... some code
await SomeProcess();
await AnotherMethod().
}
public async SomeProcess() {
//.. some code
var tasks = new Task[3];
tasks[0] = method1();
tasks[1] = method2();
tasks[2] = method3();
Task.WaitAll(tasks);
}
public async Method1(){...}
public async Method2(){...}
public async Method3(){...}
这是正确的吗?
Task.WaitAll
同步阻塞,因此您可以使用Parallel.Invoke
如果这是预期的:
Parallel.Invoke(() => method1(), () => method2(), () => method3());
只要methodX
方法本身不是异步的,这就会起作用。 Parallel.ForEach 不适用于异步操作。
如果你想等待任务异步完成,你应该使用Task.WhenAll
:
var tasks = new Task[3];
tasks[0] = method1();
tasks[1] = method2();
tasks[2] = method3();
await Task.WhenAll(tasks);
public async Task SomeProcess()
{
//.. some code
await Task.WhenAll(method1(), method2(), method3());
}
使用Task.WhenAll
返回一个新Task
,一旦所有提供的任务也完成,该任务就会完成。
您不需要手动创建数组,因为Task.WhenAll
接受params Task[]
。
正如您所尝试的Task.WaitAll
,使用Task.WaitAll
将阻塞当前线程,直到任务完成,从而使方法同步。
此外,根据应用程序的同步上下文,它可能会导致死锁,因为method1
/ method2
/ method3
可能会尝试在被WaitAll
阻塞的线程上恢复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.