繁体   English   中英

如何使这个c#属性threadsafe?

[英]How do I make this c# property threadsafe?

我有一些库实用程序,使事情变得更简单。

        public static RequestUow Uow
        {
            get { return ContextItemsHelper.Get<RequestUow>("Uow"); }
            set { ContextItemsHelper.Set<RequestUow>("Uow", value); }
        }

并在ContextItemsHelper中

    public static T Get<T>(string key)
    {
        Guard.NullOrEmpty(key, "key");

        object obj = Items[key];

        return obj.IsNotNull() ? (T)obj : default(T);
    }

    static IDictionary Items { get { return HttpContextHelper.Current.Items; } }

这工作正常,但我现在想检查属性uow是否为null,如果它设置了一个新的RequestUow并返回它。

我见过的例子涉及设置你自己的成员变量,但是我想知道这是否可能是线程安全的。

有人提供任何建议或解决方案吗?

使Items成为ConcurrentDictionary并使用它的AddOrUpdate方法。 由于集合本身是线程安全的,因此您不必关心它。

如果您的Get更改为以下内容也会更好:

public static T Get<T>(string key)
{
    Guard.NullOrEmpty(key, "key");
    return Items.GetOrAdd( key, (key) => default(T) );
}

这样,默认值在第一次尝试时添加,如果再次调用则返回。

只要字典没有变异(例如没有更新),访问它是完全线程安全的,没有任何额外的措施(*)。

请注意,如果包含的项目本身不是线程安全,则为字典设置线程安全的getter / setter没有帮助。 最安全的赌注是在字典中使用不可变项; 如果您的RequestUow对象是可变的,那么您需要使用它们(以及可能使用此字典检索的所有其他内容)进行线程安全。

*:有关.NET中线程安全集合的信息,请参阅此PDF 第18页阐明了只读访问不需要额外测量线程安全性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM