gpt4 book ai didi

c# - 异步等待与 TaskFactory.StartNew 和 WaitAll

转载 作者:行者123 更新时间:2023-11-30 22:05:38 25 4
gpt4 key购买 nike

我有一个 NServiceBus 主机,一旦有关特定用户帐户的消息通过,它就会去下载一大堆数据。一个数据文件大约 3Mb(myob - 通过网络服务调用),另一个大约 2Mb(restful 端点,相当快!)。为避免等待太久,我将两个下载调用包装成这样:

var myobBlock = Task.Factory.StartNew(() => myobService.GetDataForUser(accountId, datablockId, CurrencyFormat.IgnoreValidator));
var account = Task.Factory.StartNew(() => accountService.DownloadMetaAccount(accountId, securityContext));

Task.WaitAll(myobBlock, account);

var myobData = myobBlock.Result;
var accountData = account.Result;
//...Process AccountData Object using myobData object

我想知道与上面的 TPL 式方法相比,使用新的异步/等待模式有什么好处。阅读 Stephen Clearys 的笔记,上面的内容似乎会导致线程坐在那里等待,而 Async/Await 将继续并释放线程以进行其他工作。

您将如何在 Async/Await 的上下文中重写它,它是否有益?我们有很多帐户要处理,但每个帐户(FY 报告结束)或每个请求(当客户打电话并想要他们的报告时临时)一次 MSMQ 消息

最佳答案

使用 async/await 的好处是给定一个真正的异步 api(一个不使用 Task.Run 等调用异步方法的同步方法,但真正的异步 I/O 工作)你可以避免分配任何不必要的线程,这些线程只会浪费资源等待阻塞 I/O 操作。

假设您的两个服务方法都公开了一个 async api,您可以执行以下操作而不是使用两个 ThreadPool 线程:

var myobBlock = myobService.GetDataForUserAsync(accountId, datablockId, CurrencyFormat.IgnoreValidator));

var account = accountService.DownloadMetaAccountAsync(accountId, securityContext));

// await till both async operations complete
await Task.WhenAll(myobBlock, account);

将会发生的是,执行将返回到调用方法,直到两个任务都完成。当他们这样做时,如果需要,继续将通过 IOCP 恢复到分配的 SynchronizationContext

关于c# - 异步等待与 TaskFactory.StartNew 和 WaitAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24263408/

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