我有一个NServiceBus主机,一旦收到关于特定用户帐户的消息,它就会下载大量数据。一个数据文件大约是3Mb (myob -通过一个webservice调用),另一个是大约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-esque方法相比有什么好处。阅读Stephen的注释后,上面的内容似乎会导致线程坐在那里等待,在那里异步/等待将继续,并为其他工作释放线程。
您将如何在异步/等待的上下文中重写它,这是否有益?我们有很多帐户要处理,但它的每个帐户的MSMQ消息( FY报告的结束)或每个请求(当客户打电话要他们的报告时是临时的)。
发布于 2014-06-17 12:31:59
使用async/await的好处是,给定一个真正的异步api (该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上。
https://stackoverflow.com/questions/24263408
复制相似问题