Task.whenall与Task.GetAwaiter()。GetResult()完成任务

时间:2017-08-22 08:06:36

标签: c# async-await task-parallel-library

我是否已使用

创建Task

Task.Factory.StartNew<GroupPreferenceList>(())

并且调用一个函数,就像我有7个方法一样,所有方法都包含一个或两个API调用。现在我正在使用: Task.GetAwaiter().GetResult()非常重要的任务是获取非常任务的结果并对其进行一些操作。 我的问题是我是否应该创建另一个并使用WhenAll()或我正在做的事情是正确和快速的。

谢谢

1 个答案:

答案 0 :(得分:0)

在这方面有几点要点:

  • 而不是Task.Factory.StartNew<GroupPreferenceList>(())使用Task.Run<GroupPreferenceList>(()),这里有斯蒂芬克莱里的好消息StartNew is Dangerous
  • 除此之外,为什么你需要Task.GetAwaiter().GetResult(),我可以理解在等待的任务中使用GetAwaiter(),但这里没有用例。此外,每个调用都将在主线程上,从而消除并发的好处并等待获取每个执行的任务结果
  • 当您想为所有任务集合获取单一代表任务并等待它时,您使用WhenAll()

在这种情况下,我的建议是:

  • 只需使用Task.Run为每个任务创建一个任务集合
  • 执行Task.WaitAll等待每个完成,然后访问Task对象的每个Result调用的Result,前提是您使用Generic版本作为Task的基类没有它。

上面的答案是基于这样一个前提:您需要TPL进行处理,以防其基于IO的并发,然后将完整的调用转换为Async-Await,因为它最适合基于IO的并发