[英]Async - wait for two async tasks to finish
我有兩個在我的代碼中運行的函數調用,當兩者都完成后,運行ProcessFiles函數。 像這樣:
byte[] file1 = doSomething();
byte[] file2 = doSomethingElse();
ProcessFiles(file1, file2);
這兩個函數調用DoSomething
和DoSomethingElse
是完全獨立的,我想在不同的線程中運行它們,以便它們同時運行。 但是,當兩者都完成時,我需要處理結果(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.