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

时间:2015-06-03 13:20:55

标签: c# multithreading asynchronous

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

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

  ProcessFiles(file1, file2);

这两个函数调用DoSomethingDoSomethingElse是完全独立的,我想在不同的线程中运行它们,以便它们同时运行。 但是,当两者都完成时,我需要处理结果(file1和file2)。

我猜async await(或其VB.NET等价物)是这里的方式,但对于我的生活,我找不到任何展示这个的好例子。也许我使用了错误的搜索查询,但到目前为止我还没有得到一个好的例子。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:5)

是的,您可以使用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);

重要的是,在启动这两项任务之前,您不会等待任何一项任务。

答案 1 :(得分:5)

  

我在考虑在不同的线程中运行这些...我猜async await

请注意,async / await并不意味着任何特定类型的线程。 Async / await处理异步代码,而不是并行代码。有关详细信息,请参阅我的async intro

但是,您可以使用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);