运行两个任务的正确方法
本文关键字:方法 任务 两个 运行 | 更新日期: 2023-09-27 18:02:55
我想知道这种方法并行运行两个长时间运行的操作,然后得到他们的结果是正确的,如果有任何优势使用async/await代替。
public int DoStuff()
{
var res1 = Task.Run(() => LongRunning1());
var res2 = Task.Run(() => LongRunning2());
Task.WhenAll(res1, res2);
return res1.Result + res2.Result;
}
int LongRunning1()
{
Thread.Sleep(30);
return 10;
}
int LongRunning2()
{
Thread.Sleep(10);
return 20;
}
以这种方式并行运行任务是可以的。WhenAll
线不做任何事情,可以移除。还要注意,Result
将在AggregateException
中包装任何异常;这在运行并行代码时是正常的。
public int DoStuff()
{
var res1 = Task.Run(() => LongRunning1());
var res2 = Task.Run(() => LongRunning2());
return res1.Result + res2.Result;
}
然而,如果任务是自然异步的(例如,I/o绑定),那么您可以使用并发异步代码来代替并行代码:
async Task<int> LongRunning1Async()
{
await Task.Delay(30);
return 10;
}
async Task<int> LongRunning2Async()
{
await Task.Delay(10);
return 20;
}
public async Task<int> DoStuffAsync()
{
var res1 = LongRunning1Async();
var res2 = LongRunning2Async();
return await res1 + await res2;
}
,或者另外:
public async Task<int> DoStuffAsync()
{
var res1 = LongRunning1Async();
var res2 = LongRunning2Async();
var results = await Task.WhenAll(res1, res2);
return results[0] + results[1];
}