簡體   English   中英

異步 - 等待兩個異步任務完成

[英]Async - wait for two async tasks to finish

我有兩個在我的代碼中運行的函數調用,當兩者都完成后,運行ProcessFiles函數。 像這樣:

  byte[] file1 = doSomething();
  byte[] file2 = doSomethingElse();

  ProcessFiles(file1, file2);

這兩個函數調用DoSomethingDoSomethingElse是完全獨立的,我想在不同的線程中運行它們,以便它們同時運行。 但是,當兩者都完成時,我需要處理結果(file1和file2)。

我想異步等待(或其VB.NET等價物)是這里的方式,但對於我的生活,我找不到任何展示這個的好例子。 也許我使用了錯誤的搜索查詢,但到目前為止我還沒有得到一個好的例子。 有人能指出我正確的方向嗎?

是的,您可以使用async / await輕松完成此操作。 例如:

// If you don't have async equivalents, you could use Task.Run
// to start the synchronous operations in separate tasks.
// An alternative would be to use Parallel.Invoke
Task<byte[]> task1 = DoSomethingAsync();
Task<byte[]> task2 = DoSomethingElseAsync();

byte[] file1 = await task1;
byte[] file2 = await task2;
ProcessFiles(file1, file2);

重要的是,在你啟動這兩項任務之前,你不會等待任何一項任務。

我想在不同的線程中運行這些...我想異步等待

請注意, async / await並不意味着任何特定類型的線程。 Async / await處理異步代碼,而不是並行代碼。 有關更多信息,請參閱我的async介紹

但是,您可以使用Task.Run在線程池線程上執行代碼,然后您可以使用Task.WhenAll (異步)等待它們完成:

var task1 = Task.Run(() => doSomething());
var task2 = Task.Run(() => doSomethingElse());

var results = await Task.WhenAll(task1, task2);
ProcessFiles(results[0], results[1]);

或者,由於您的代碼已經是同步的,因此您可以使用WaitAll 請注意,您的錯誤處理與並行代碼不同(您需要為AggregateException做好准備):

var task1 = Task.Run(() => doSomething());
var task2 = Task.Run(() => doSomethingElse());

Task.WaitAll(task1, task2);
ProcessFiles(task1.Result, task2.Result);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM