gpt4 book ai didi

c# - 并行运行异步方法

转载 作者:可可西里 更新时间:2023-11-01 07:51:13 24 4
gpt4 key购买 nike

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

我什至尝试在任务中和周围使用 await 和 async,但它真的很困惑,我没有运气。

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

最佳答案

Is there a better to run async methods in parallel, or are tasks a good approach?

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

考虑以下问题:

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

return Task.WhenAll(first, second);
}

注意

最好使用“Async”后缀,而不是 GetThingsGetExpensiveThing - 我们应该有 GetThingsAsyncGetExpensiveThingAsync 分别为 - source .

关于c# - 并行运行异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38634376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com