1

我有一个程序集,它计算一个复杂的数学值。此程序集由 ASP.NET 应用程序使用(但没有对 的引用System.Web,因此无法访问 Web 缓存等)。

我希望为进入 Web 应用程序的所有请求缓存复杂计算的结果。

我是否正确地认为我的数学课中的静态字段将被初始化一次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 。它基本上用作 ASP.NET 缓存,不需要任何 System.Web 程序集的依赖项。

于 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 回答