异步-等待两个异步任务完成

本文关键字:异步 两个 任务 等待 | 更新日期: 2023-09-27 17:52:54

我有两个函数调用在我的代码中运行,当两者都完成时,函数ProcessFiles运行。这样的:

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

这两个函数调用DoSomethingDoSomethingElse是完全分开的,我正在考虑在不同的线程中运行这些,因此它们同时运行。但是,当两者都完成时,我需要处理结果(file1和file2)。

我猜async await(或其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/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);