为什么await Task.WhenAll()可以提高性能?

问题描述 投票:0回答:1

我试图理解这两段代码之间的区别:

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()
中工作?

c# asynchronous async-await task-parallel-library .net-7.0
1个回答
0
投票

当您

await
在代码中的任何位置时,它会逻辑上阻塞,并且不允许执行下一行代码,直到
Task
返回值。如果您执行一个
await
而不是两个,您会自动使算法运行得更快,因为它等待的时间更少。只需计算代码中等待的原始数量即可找出哪个执行速度更快。

© www.soinside.com 2019 - 2024. All rights reserved.