1

彼ら、

以下の次のコードを評価していただきたいと思います。ご覧のとおり、私はInterlocked.CompareExchangeを使用していますが、このコンテキストでは意味がありますか?(それが正しいかどうかはわかりません)。

メモやコメントなどはよろしくお願いします。

private static T GetItem<T>(string cacheKey, Func<T> getItemCallback) where T : class
{
    var item = (HttpRuntime.Cache.Get(cacheKey) as T);

    if (item != null)
    {
        return item;
    }

    item = getItemCallback.Invoke();

    if (item != null)
    {
        HttpContext.Current.Cache.Insert(cacheKey, item);
    }

    return item;
}

public T Get<T>(string cacheKey, Func<T> getItemCallback) where T : class
{
    var item = (HttpRuntime.Cache.Get(cacheKey) as T);

    if (item != null)
    {
        return item;
    }

    Interlocked.CompareExchange(ref item, GetItem(cacheKey, getItemCallback), null);

    return item;
}

よろしくお願いします。

4

1 に答える 1

4

いいえ、この特定の場合にCompareExchangeを使用することは意味がありません。ローカル変数には、現在のスレッドからそのままアクセスできます。その行は次のように置き換えることができます。

 item =  GetItem(cacheKey, getItemCallback);

CompareExchange()を使用してクラス内のフィールドにアクセスすることを検討します。

于 2012-06-17T00:57:02.400 に答える