ASP.NET Core线程中的默认IServiceProvider是否安全?

时间:2017-08-07 10:37:08

标签: c# asp.net multithreading asp.net-core

我正在构建一个小型的ASP.NET核心应用程序,该应用程序还有一堆独立的业务逻辑,可以在自己的线程中运行。我已经在旁边程序中使用了IServiceProvider,所以当我发现ASP.NET Core也使用它自己的IServiceProvider时,所以我想我只能重用一个实例。

现在问题是,网络主机使用线程安全的IServiceProvider是什么?我的设置基本上看起来像这样

var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .UseApplicationInsights()
            .Build();

Task.Run(() => {
  // here I access the IServiceProvider via `host.Services`
  new Foo(host.Services).Run();
});

host.Run();

1 个答案:

答案 0 :(得分:5)

The default service provider implementation。您可以看到服务工厂存储在ConcurrentDictionary中,building an expression for creating service object在除第一个之外的单独线程中执行。我确信这个表达式也是线程安全的(可能是无状态的)。所以默认的ServiceProvider是线程安全的。