1

物事を少し簡単にするライブラリユーティリティがいくつかあります。

        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; } }

これは正常に機能しますが、新しい RequestUow が設定されている場合は、プロパティ uow が null であるかどうかを確認して、それを返したいと思います。

私が見た例には、独自のメンバー変数の設定が含まれていますが、これがスレッドセーフである可能性が高いかどうか疑問に思っています。

アドバイスや解決策はありますか?

4

3 に答える 3

3

ConcurrentDictionaryItemsを作成し、その AddOrUpdateメソッドを使用します。コレクション自体はスレッド セーフであるため、気にする必要はありません。

Get次のように変更した方が良いでしょう:

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

このように、デフォルトは最初の試行で追加され、再度呼び出された場合に返されます。

于 2012-09-07T14:01:18.880 に答える
0

ディクショナリが変更されない (更新がないなど) 限り、アクセスは追加の対策なしで完全にスレッドセーフです (*)。

含まれているアイテム自体がスレッドセーフでない場合、ディクショナリにスレッドセーフな getter/setter を使用しても役に立たないことに注意してください。最も安全な方法は、ディクショナリで不変の項目を使用することです。オブジェクトが変更可能な場合RequestUowは、それら (およびこの辞書を使用して取得される可能性のある他のすべてのもの) もスレッドセーフにする必要があります。

*: .NET のスレッド セーフ コレクションについては、たとえばこの PDFを参照してください。18 ページでは、読み取り専用アクセスではスレッド セーフのために追加の測定を行う必要がないことを明確にしています。

于 2012-09-07T14:05:30.443 に答える
0

使用パターンダブルチェックロックパターン

于 2012-09-07T14:01:49.270 に答える