首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步等待与TaskFactory.StartNew和WaitAll

异步等待与TaskFactory.StartNew和WaitAll
EN

Stack Overflow用户
提问于 2014-06-17 12:08:11
回答 1查看 745关注 0票数 2

我有一个NServiceBus主机,一旦收到关于特定用户帐户的消息,它就会下载大量数据。一个数据文件大约是3Mb (myob -通过一个webservice调用),另一个是大约2Mb (restful端点,相当快!)。为了避免等待太久,我将两个下载调用包装如下:

代码语言:javascript
复制
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-esque方法相比有什么好处。阅读Stephen的注释后,上面的内容似乎会导致线程坐在那里等待,在那里异步/等待将继续,并为其他工作释放线程。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-17 12:31:59

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

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

代码语言:javascript
复制
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上。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24263408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档