1

複雑な数学的値を計算するアセンブリがあります。このアセンブリは、ASP.NET アプリケーションによって消費されます (ただし、への参照がないSystem.Webため、Web キャッシュなどにはアクセスできません)。

複雑な計算の結果を、Web アプリに送信されるすべてのリクエストに対してキャッシュする必要があります。

私の数学クラスの静的フィールドは 1 回につき 1 回初期化され、複数のリクエストに対応し、それぞれが静的フィールドから読み取られると考えるのは正しいAppDomainですAppDomainか?

例えば:

public static class MyMath
{
    private static ConcurrentDictionary<int, decimal> results = new ConcurrentDictionary<int, decimal>();

    public static decimal ComputeValue(int input)
    {
        decimal result;

        if (!results.TryGetValue(int, out result))
        {
            result = ComputeComplicatedValue(int);
            results.TryAdd(input, result);
        }

        return result;
    }
}

その例では、関連のない複数のリクエストに対してスレッドセーフにキャッシュされた結果が得られますか?

ありがとう

4

4 に答える 4

2

はい、それはうまくいきます。

静的変数は、すべてのスレッドで共有され、アクセスするにはロックが必要なため、Web アプリケーションでの使用が制限されています。

この場合、すべてのスレッド間でディクショナリを共有する必要ConcurrentDictionaryがあり、スレッドセーフであるため、ロックが処理されます。

于 2012-09-22T13:05:35.307 に答える
1

System.Runtime.Cachingにある ObjectCache を使用できます。System.Web アセンブリの依存関係を必要とせずに、基本的に ASP.NET キャッシュとして機能します。

于 2012-09-22T13:10:40.667 に答える
0

Webサーバーに直接キャッシュできます。計算する要求は、キャッシュに存在するかどうかを確認してから、アセンブリを呼び出すことができます。

それ以外の場合は、静的数学クラスをすべてのインスタンスで共有する必要がありますが、私はそれが好きではありませんでした。

于 2012-09-22T12:45:32.163 に答える
0

アプリケーションオブジェクトを使用すると、アプリケーションレベルでアクセスできます

object someValue;
Application.Add("name", someValue);

これで取得できます

Application["name"]
于 2012-09-22T12:47:28.743 に答える