簡體   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