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