1

キャッシュとの相互作用を容易にするCacheHelperクラスがあります。staticintフィールドを使用してキャッシュタイムアウトを指定したいと思います。このフィールドは最初はconstのデフォルト値に設定されていますが、アプリケーションがデフォルトのタイムアウト値を変更する方法を提供したいと思います。

静的な値の型を変更するときにロックする必要がありますか?セッターのロックは必要ですか?ここで見られる他の問題はありますか?申し訳ありませんが、マルチスレッドに関してはまだかなり馬鹿です。

ありがとう。

public static class CacheHelper
{
    private static object _SyncRoot;
    private static int _TimeoutInMinutes = CacheDefaults.TimeoutInMinutes; 

    public static int TimeoutInMinutes
    {
        get
        {
            return _TimeoutInMinutes;
        }
        set
        {
            lock (_SyncRoot)
            {
                if (_TimeoutInMinutes != value)
                {
                    _TimeoutInMinutes = value;
                }
            }
        }
    }

    public static void Insert(string key, Object data)
    {
        if (HttpContext.Current != null && data != null)
        {
            HttpContext.Current.Cache.Insert(key, data, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(CacheHelper.TimeoutInMinutes));
        }
    }
}
4

2 に答える 2

2

代わりに volatile 変数を使用することもできます...しかし、何かが必要です。そうしないと、あるスレッドによって書き込まれた値が別のスレッドに表示されない可能性があります。

doubleorなどの「より大きな」型の場合、これらの値の変更はアトミックではない可能性があるため、long実際にはロックまたはクラスを使用する必要があることに注意してください。Interlocked

于 2010-08-17T16:37:42.730 に答える
0

CacheHelper のクライアントが次のようなことを行う場合、ここでロックする必要はありません

CacheHelper.TimeoutInMinutes = input.Value; 

以前の値に依存しないためです。

クライアントが次のようなことをする場合

CacheHelper.TimeoutInMinutes += input.Value; 

次に、いくつかのロックを行う必要があります

.

于 2010-08-17T16:42:24.573 に答える