簡體   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