我试图理解这两段代码之间的区别:
private async Task<ShopData> LoadShopData()
{
// These perform MongoDB queries
Task<IEnumerable<ShopMerchant>> fetchMerchants = _ShopSource.GetMerchants();
Task<IEnumerable<ShopMerchant>> fetchTiers = _ShopSource.GetTiers();
var shopData = new ShopData
{
ShopMerchants = (await fetchMerchants).ToList(),
ShopTiers = (await fetchTiers).ToList()
};
return shopData;
}
// Second option:
private async Task<ShopData> LoadShopData()
{
// These perform MongoDB queries
Task<IEnumerable<ShopMerchant>> fetchMerchants = _shopSource.GetMerchants();
Task<IEnumerable<ShopMerchant>> fetchTiers = _shopSource.GetTiers();
var tasks = new List<Task>
{
fetchMerchants,
fetchTiers
};
await Task.WhenAll(tasks);
var shopData = new ShopData
{
ShopMerchants = (fetchMerchants.Result).ToList(),
ShopTiers = (fetchTiers.Result).ToList()
};
return shopData;
}
我认为第二种方法会更好,但是在任何一种情况下,主线程都不会被阻塞,因为即使在第一种方法中,当线程遇到
await
关键字时,线程也可以自由地继续执行调用堆栈上方的任何工作.
第二种方法的性能是否只是因为 main 方法只需要返回一次而不是两次来继续在
LoadShopData()
中工作?
当您
await
在代码中的任何位置时,它会逻辑上阻塞,并且不允许执行下一行代码,直到Task
返回值。如果您执行一个 await
而不是两个,您会自动使算法运行得更快,因为它等待的时间更少。只需计算代码中等待的原始数量即可找出哪个执行速度更快。