我已经导入了 Microsoft.VisualStudio.Threading进入 .Net Core Web App。我这样做是专门为了利用 AsyncLazy<T>
.
我想确保我这样做是正确的,所以我导入了适当的 Analyzers .
警告和文档明确指出 JoinableTaskFactory
应该注入(inject)到我的实现中。
我的问题是,我应该如何实例化 JoinableTaskFactory
在我的 .Net Core Web 应用程序的配置中?
是不是就这么简单
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddSingleton(new JoinableTaskFactory());
// ...
}
或者,这都是错的吗?
最佳答案
是的,您可以在 ASP.NET Core 应用程序中使用 Microsoft.VisualStudio.Threading
库。但是虽然 JoinableTaskFactory
会在这样的应用程序中“工作”,但这是一个很好的迹象,表明您做错了什么。
当然,分析器总是合适的,您看到的警告可能指出您不应该调用 Task.Result
、Task.Wait()
,等等。这些同步阻塞线程并且可以严重降低您的网络应用程序(或与此相关的任何应用程序)的可扩展性。您应该尽可能使用 await。
JoinableTaskFactory
可以在您不能使用await 但仍需要调用异步代码时介入。使用 JTF.Run
仍会阻塞调用线程,但是当您在应用程序中有单线程 SynchronizationContext
时,它会以一种避免死锁的方式进行。我认为 ASP.NET Core 没有这样的东西,所以这不是问题。 JTF.Run
仍然比 Task.Wait
更高效,因为它可以重复使用原始线程而不是第二个线程。
如果您确实选择在您的网络应用程序中使用 JTF,如果 ASP.NET Core 不使用单线程 SynchronizationContext
,那么您可以创建并共享一个整个应用程序的单个 JTF 实例。但是如果它确实有一个单线程的SynchronizationContext
,它将是每个网络请求一个,这意味着您需要为创建一个新的JoinableTaskContext
每个 请求,因为它们关联到一个 SynchronizationContext
。您总是从 JoinableTaskContext
实例中获取 JTF 实例。
关于c# - 我是否将 JoinableTaskFactory 与 AspNetCore 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55535494/