并行运行异步方法

2023-12-14

我有一个异步方法,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 };
}

我什至尝试在任务中和周围使用等待和异步,但这真的很令人困惑,而且我没有运气。

是否有更好的并行运行异步方法,或者任务是一个好方法?


是否有更好的并行运行异步方法,或者任务是一个好方法?

是的,“最好”的方法是利用Task.WhenAll方法。但是,您的第二种方法应该并行运行。我创建了一个.NET 小提琴,这应该有助于阐明一些情况。您的第二种方法实际上应该并行运行。我的小提琴证明了这一点!

考虑以下:

public Task<Thing[]> GetThingsAsync()
{
    var first = GetExpensiveThingAsync();
    var second = GetExpensiveThingAsync();

    return Task.WhenAll(first, second);
}

Note

最好使用“Async”后缀,而不是GetThings and GetExpensiveThing- 我们本应该GetThingsAsync and GetExpensiveThingAsync分别 -source.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并行运行异步方法 的相关文章

随机推荐