何时使用 Task.Run().GetAwaiter().GetResult() 和 ().GetAwaiter.GetResult()? [复制]

2024-01-15

我有一个需要同步调用的异步任务(是的,不幸的是,这是不可避免的)。似乎有两种方法可以实现这一点 - 每种方法似乎都有效。所以我不确定哪种方法是最好的方法,或者是否有更好的方法。

例如:

var meetings = Task.Run(() => GetTodaysMeetingsAsync()).GetAwaiter().GetResult();

var meetings = GetTodaysMeetingsAsync().GetAwaiter().GetResult();

如果有人能够解释为什么一种方法比另一种方法更好,我们将不胜感激。谢谢!


当你使用Task.Run,委托的初始同步部分在线程池线程上运行,而只是().GetAwaiter().GetResult()将在同一线程上运行该同步部分。

Using Task.Run(...).GetAwaiter().GetResult()可以用作运行异步代码并同步等待它的解决方法,它不会导致异步死锁,而().GetAwaiter().GetResult()可以。请注意,它仍然不是“安全”的,因为您可能在线程池线程内阻塞,在服务器上这可能会导致负载时线程池耗尽。

如果你想运行一个Task返回方法,以及know初始同步部分是微不足道的,并且您知道异步方法的其余部分不会与SynchronizationContext, just ().GetAwaiter().GetResult()可以是微观优化,我想说只有在你知道的情况下才这样做exactly你在做什么。

你怎么知道你正在运行SynchronizationContext? SynchronizationContext.Currentnull,由于以下原因之一:

  • You know您的代码在没有该模型的应用程序模型下运行(控制台应用程序、ASP.NET Core、Windows 服务)
  • 您已使用过.ConfigureAwait(false)在等待的不完整的Task之前在当前堆栈中。
  • 您已明确调用SynchronizationContext.SetSynchronizationContext(null)

所以你看,需要考虑很多,所以一般来说你几乎总是想使用Task.Run(...).GetAwaiter.GetResult().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时使用 Task.Run().GetAwaiter().GetResult() 和 ().GetAwaiter.GetResult()? [复制] 的相关文章

随机推荐