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

标签 c# asp.net-core async-await

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

相关文章:

asp.net-core - 如何在 JWT token 中包含声明?

asp.net-core - 如何在 ASP.NET Core(.NET Framework 目标)项目中引用旧程序集?

javascript - Promise 返回数据 '<pending>'

node.js - 顶级等待是否有超时?

线宽的 C# 编码约定

c# - 将 UnitOfWork 与存储库模式结合使用

c# - 为什么我不能在 PostBack 上更新 HiddenFields?

c# - 查找 Fortran 源文件中计算变量的位置

c# - 似乎无法通过 ASP.Net Core 连接到 SQL Server(一直返回空值)

c# - 将 HttpClient .NET 4.5 的代码降级到 .NET 4.0