gpt4 book ai didi

c# - 是否将 Task<>.Factory.StartNew/Task.Factory.ContinueWhenAll() 转换为 async/await?

转载 作者:太空宇宙 更新时间:2023-11-03 23:23:53 26 4
gpt4 key购买 nike

我有下面的简化代码,可以异步获取多个承运人的运费,我想知道是否值得转换为使用异步/等待方法,如果是的话,最好的方法是什么?或者如果它现在工作正常,真的不值得付出努力吗?谢谢。

List<Task<ShippingRateCollection>> lstTasks = new List<Task<ShippingRateCollection>>();
Task<ShippingRateCollection> t;

t = Task<ShippingRateCollection>.Factory.StartNew(() => { return GetUPSRates(...); });
lstTasks.Add(t);

t = Task<ShippingRateCollection>.Factory.StartNew(() => { return GetUSPSRates(...); });
lstTasks.Add(t);

t = Task<ShippingRateCollection>.Factory.StartNew(() => { return GetFedExRates(...); });
lstTasks.Add(t);

//wait until all requests complete (or error out)
Task.Factory.ContinueWhenAll(lstTasks.ToArray(), (tasks) =>
{
//wrap all exceptions into 1 AggregateException
Task.WaitAll(tasks);
});

foreach (Task<ShippingRateCollection> task in lstTasks)
{
foreach (ShippingRate rate in task.Result)
{
... //display rate
} //next returned rate
}

最佳答案

如果可以使 Get*Rates 方法异步,则绝对应该将其重构为 async/await。在您当前的代码中,您在单独的线程上执行它们只是为了阻塞等待 I/O 完成的线程。那是一种浪费。

如果您可以使这些方法异步,代码可能如下所示:

var tasks = new Task<ShippingRateCollection>[]
{
GetUPSRatesAsync(),
GetUSPSRatesAsync(),
GetFedExRatesAsync()
};

ShippingRateCollection[] results = await Task.WhenAll(tasks);

// process results

即使您必须使用同步 GetRates 方法,将代码重构为 async/await 也会简化它。

关于c# - 是否将 Task<>.Factory.StartNew/Task.Factory.ContinueWhenAll() 转换为 async/await?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34458611/

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