【问题标题】:C# ASP.NET Thread Safe static read only fieldC# ASP.NET 线程安全静态只读字段
【发布时间】:2011-01-22 23:07:38
【问题描述】:

我的 ASP.NET 项目中有以下代码

public sealed class IoC
{
    private static readonly IDependencyResolver resolver =
        Service.Get("IDependencyResolver") as IDependencyResolver;

    static IoC()
    {
    }

    private IoC()
    {
    }

    public static IDependencyResolver Container
    {
         get
         {
             return resolver;
         }
    }
}

public static class Service
{
    public static object Get(string serviceName)
    {
        // Code to create and return instance...
    }
}

IoC.Container 会是线程安全的吗?

【问题讨论】:

    标签: asp.net thread-safety


    【解决方案1】:

    静态字段的初始化是线程安全的:也就是说,.NET 运行时保证您的字段只会在程序中初始化一次,无论有多少线程访问它以及以什么顺序访问它。

    正如 Andrey 指出的,Service.Get 方法本身需要是线程安全的。

    【讨论】:

    • 据我了解,Service.Get 将在每个应用程序域中调用一次,因此每个线程都会收到相同的解析器实例,这是正确的吗?
    • 您的private static readonly IDependencyResolver resolver 字段将仅在每个应用程序域中初始化一次,正确。在Get 内部仍然可以做一些不安全的事情,但我想这不是你要问的。
    • 在 Service.Get 中,我只从 web.config 读取解析器类型,并使用 Activator 获取该类型的解析器实例。但我担心的是,处理我的请求的每个线程都使用相同的解析器实例。
    • 是的,这很安全。顺便说一句,你不想要(IDependencyResolver) Service.Get("IDependencyResolver") 吗?如果出现问题,我宁愿使用InvalidCastException - as 关键字只会给您留下空引用。
    【解决方案2】:

    IoC 本身看起来不错,但如果resolver 不是线程安全的,则整个结构将不是线程安全的。如果你想每个线程都有解析器,你可以使用属性 [ThreadStatic]

    【讨论】:

    • 我希望所有线程使用相同的解析器实现实例
    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 2012-01-07
    • 2019-05-21
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    相关资源
    最近更新 更多