【问题标题】:Task.whenall vs Task.GetAwaiter().GetResult() on very taskTask.whenall vs Task.GetAwaiter().GetResult() 非常任务
【发布时间】:2017-08-23 16:45:33
【问题描述】:

我是否使用以下方法创建了Task

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

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

谢谢

【问题讨论】:

  • 请张贴代码。只是这个描述有点含糊。
  • 只有当你想等到它们都准备好时,你才必须使用WhenAll()
  • 好吧,一方面Task.GetAwaiter().GetResult 是一个阻塞调用,可能导致死锁。所以使用await。其次,如果任务可以并行运行使用WhenAll,否则它们将按顺序等待对方完成。
  • #Peter Bons,因为任务是通过使用 Factory.start() 创建的,然后函数被执行,这就是我不使用 WhenAll() 的原因,如果错了,请提出。

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


【解决方案1】:

在这方面有几点:

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

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

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

上面的回答是基于你需要TPL来处理的前提,如果它的基于IO的并发,然后将完整的调用转换为Async-Await,因为这最适合基于IO的并发

【讨论】:

  • 嗨,Mrinal,已经通过使用 Task.RunwaitAll 尝试了您的建议,然后通过 .Result 收集每个任务的结果,但是对性能没有任何影响。
  • @SantoshJha 你可能误解了我的观点,因为这完全取决于你正在处理的数据/记录的数量,TPL 是否会为内存处理提供好处。假设您有足够的数据来处理,我提供了任务 API 的正确用法。您可以使用一些源代码和数据详细信息更新问题,如果方法很少,最好调用 W/o TPL
  • 实际上我的 Action 需要 15 到 20 秒才能执行,并且有 7 个 Web Api 调用,并且每个服务都获得了最多 30 到 50 条记录,有 20 多列。这就是为什么我想实现 Task 这样我就可以节省服务的调用时间。但它仍然需要更少的时间。 那么有什么方法可以计算任务创建所花费的时间。这样我们就可以假设TPL是否会受益.
  • @SantoshJha 因为您似乎有许多 Web API 调用,但数据并不多。 Task Parallel 库在这里不是一个好的选择,您需要将整个系统转换为 Async Await 调用,因为这些是 IO 调用,适用于您的用例。可以使用简单的秒表来测量任务时间,这不是什么大问题,但这里的设计本身就有缺陷
  • 嗨,谢谢。您能否发送一些链接以了解 TPL 和 Async await 模式的区别,根据我的理解,使用 Task 在不同线程上调用同步方法并在主线程上执行一些其他操作将节省时间。由于我是 TPL 新手,并且为了使用异步等待模式,我需要通过 API 调用将所有函数更改为异步并返回 Task.fromresult。所以我想实现Task。另一件事我的动作是返回一个局部视图,因此无法使动作 async 。希望已经说明了我的问题和想法。
猜你喜欢
  • 2018-05-12
  • 2020-08-05
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 2018-08-30
  • 2015-05-03
相关资源
最近更新 更多