async await vs TaskFactory.StartNew和WaitAll

时间:2014-06-17 12:08:12

标签: c# .net asynchronous task-parallel-library async-await

我有一个NServiceBus主机,一旦有关特定用户帐户的消息传来,就会下载一大堆数据。一个数据文件是关于3Mb(myob - 通过webservice调用),另一个是大约2Mb(宁静的端点,非常快!)。为了避免等待很长时间,我已经包装了两个下载调用:

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-esque方法相比。阅读Stephen Clearys的注意事项,似乎上述情况会导致线程在那里等待,Async / Await将继续并释放线程以进行其他工作。

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

1 个答案:

答案 0 :(得分:3)

使用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