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

C# 使用C并行执行任务。我这样做对吗?,c#,parallel-processing,task,C#,Parallel Processing,Task,我已经搜索并阅读了,我只是想确定我是否是对的。我有三个方法要并行运行,我想确保在继续之前完成所有这些方法。它们都是异步的,并且这段代码在一个异步方法中。我已经做到了: public async ProcessBegin() { //... some code await SomeProcess(); await AnotherMethod(). } public async SomeProcess() { //.. some code var task

我已经搜索并阅读了,我只是想确定我是否是对的。我有三个方法要并行运行,我想确保在继续之前完成所有这些方法。它们都是异步的,并且这段代码在一个异步方法中。我已经做到了:

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(() => method1(), () => method2(), () => method3());
只要methodX方法本身不是异步的,这种方法就可以工作

如果要等待任务异步完成,应使用Task.whalll:

Task.WaitAll同步块,因此您可以使用Parallel.Invoke(如果需要):

Parallel.Invoke(() => method1(), () => method2(), () => method3());
只要methodX方法本身不是异步的,这种方法就可以工作

如果要等待任务异步完成,应使用Task.whalll:

使用Task.WhenAll,它返回一个新任务,一旦提供的所有任务都完成,该任务就会完成

您不需要手动创建数组,因为Task.WhenAll接受params Task[]

正如您所尝试的那样,使用Task.WaitAll将阻塞当前线程,直到任务完成,从而呈现同步方法

此外,它可能会导致死锁,具体取决于应用程序的同步上下文,因为method1/method2/method3可能会尝试在WaitAll阻止的线程上恢复

使用Task.WhenAll,它返回一个新任务,一旦提供的所有任务都完成,该任务就会完成

您不需要手动创建数组,因为Task.WhenAll接受params Task[]

正如您所尝试的那样,使用Task.WaitAll将阻塞当前线程,直到任务完成,从而呈现同步方法


此外,它可能会导致死锁,具体取决于应用程序的同步上下文,因为method1/method2/method3可能会尝试在WaitAll阻止的线程上恢复。

这可能会导致死锁;你能提供更多的上下文吗?这个方法是同步的吗?看看wait Task.WhenAlltasks;通常,它可能是异步的,这意味着您显示的代码本身是一个返回任务的方法,而不是Task.WaitAlltasks;它应该是wait Task.WhenAlltasks;。您不需要将任务数组构造为Task.WaitAll/WhenAll,也不需要将其签名为params Task[]tasks-因此等待Task.WhenAllmethod1、method2、method3;。放置几个断点,按F5,您将看到您是否正确操作:根据方法,Method1、Method2和Method3应命名为Method1Async、Method2Async和Method3Async。这可能会导致死锁;你能提供更多的上下文吗?这个方法是同步的吗?看看wait Task.WhenAlltasks;通常,它可能是异步的,这意味着您显示的代码本身是一个返回任务的方法,而不是Task.WaitAlltasks;它应该是wait Task.WhenAlltasks;。您不需要将任务数组构造为Task.WaitAll/WhenAll,也不需要将其签名为params Task[]tasks-因此等待Task.WhenAllmethod1、method2、method3;。放几个断点,按F5,你就会看到你做的是否正确:根据方法1,方法2和方法3应该命名为Method1Async,Method2Async和Method3Async。这里的一个重要点是Method1/2/3的签名。如果它们是非异步的,则最好使用Parallel.Invoke。如果它们本质上是异步的,则不能使用Parallel.Invoke并应使用Task.WhenAll。可以这样说,当使用WhenAll时,它将等待所有任务完成,即使其中一个任务失败them@ckuri:这是一个很好的观点。我编辑了我的答案以澄清这一点。@mm8使用这种方式将并行运行这些方法?@LeandroSouza:Task.WhenAll?是的,前提是methodX启动并返回一个不完整的任务。这里的一个要点是method1/2/3的签名。如果它们是非异步的,则最好使用Parallel.Invoke。如果它们本质上是异步的,则不能使用Parallel.Invoke并应使用Task.WhenAll。可以这样说,当使用WhenAll时,它将等待所有任务完成,即使其中一个任务失败them@ckuri:这是一个很好的观点。我编辑了我的答案以澄清这一点。@mm8使用这种方式将并行运行这些方法?@LeandroSouza:Task.WhenAll?是的,前提是methodX启动并返回一个不完整的任务。
public async Task SomeProcess()
{
    //.. some code    

    await Task.WhenAll(method1(), method2(), method3());
}