我想知道这种方法是否可以并行运行两个长时间运行的操作,然后获得结果是正确的,如果使用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;
}
答案 0 :(得分:4)
以这种方式并行运行任务很好。 WhenAll
行无效,可以删除。另请注意,Result
将在AggregateException
中包含任何例外;运行并行代码时这是正常的。
public int DoStuff()
{
var res1 = Task.Run(() => LongRunning1());
var res2 = Task.Run(() => LongRunning2());
return res1.Result + res2.Result;
}
但是,如果任务是自然异步的(例如,I / O绑定),那么您可以执行并发异步代码而不是 parallel 代码:
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];
}