我有一个异步方法,GetExpensiveThing()
,它执行一些昂贵的 I/O 工作。这就是我的使用方式:
// Serial execution
public async Task<List<Thing>> GetThings()
{
var first = await GetExpensiveThing();
var second = await GetExpensiveThing();
return new List<Thing>() { first, second };
}
但由于这是一种昂贵的方法,我想并行执行这些调用。我本以为移动等待就可以解决这个问题:
// Serial execution
public async Task<List<Thing>> GetThings()
{
var first = GetExpensiveThing();
var second = GetExpensiveThing();
return new List<Thing>() { await first, await second };
}
这不起作用,所以我将它们包装在一些任务中,这有效:
// Parallel execution
public async Task<List<Thing>> GetThings()
{
var first = Task.Run(() =>
{
return GetExpensiveThing();
});
var second = Task.Run(() =>
{
return GetExpensiveThing();
});
return new List<Thing>() { first.Result, second.Result };
}
我什至尝试在任务中和周围使用等待和异步,但这真的很令人困惑,而且我没有运气。
是否有更好的并行运行异步方法,或者任务是一个好方法?