async await vs TaskFactory.StartNew and WaitAll
本文关键字:and WaitAll StartNew TaskFactory await vs async | 更新日期: 2023-09-27 18:09:09
我有一个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
我想知道使用新的async/await模式与我上面提到的tpl式方法相比有什么好处。阅读Stephen Clearys的笔记,上面似乎会导致线程坐在那里等待,而Async/Await将继续并释放线程以进行其他工作。
在Async/Await的环境中,你会如何重写它,它是否有益?我们有很多帐户要处理,但每个帐户(财政报告结束)或每个请求(当客户打电话并想要他们的报告时特别设置)只有一次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
上。