gpt4 book ai didi

c# - 我是否将 JoinableTaskFactory 与 AspNetCore 一起使用?

转载 作者:太空狗 更新时间:2023-10-29 23:36:00 32 4
gpt4 key购买 nike

我已经导入了 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.ResultTask.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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com