繁体   English   中英

使用 C# 并行执行任务。 我这样做对吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM