我有两个在我的代码中运行的函数调用,当两者都完成后,运行ProcessFiles函数。像这样:
byte[] file1 = doSomething();
byte[] file2 = doSomethingElse();
ProcessFiles(file1, file2);
这两个函数调用DoSomething
和DoSomethingElse
是完全独立的,我想在不同的线程中运行它们,以便它们同时运行。
但是,当两者都完成时,我需要处理结果(file1和file2)。
我猜async await(或其VB.NET等价物)是这里的方式,但对于我的生活,我找不到任何展示这个的好例子。也许我使用了错误的搜索查询,但到目前为止我还没有得到一个好的例子。有人能指出我正确的方向吗?
答案 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);