【问题标题】:Memoization in ASP.NETASP.NET 中的记忆
【发布时间】:2012-09-14 15:55:55
【问题描述】:

我有一个程序集,可以计算一个复杂的数学值。此程序集由 ASP.NET 应用程序使用(但没有对 System.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;
    }
}

该示例是否为我提供了多个不相关请求的线程安全缓存结果?

谢谢

【问题讨论】:

  • 为了避免为单个 int 计算两次值,请考虑 GetOrAdd 而不是 TryGet 和 TryAdd。
  • Malcom,我正在用缓存做类似的事情。你最终做了什么来解决你的问题?

标签: c# asp.net caching concurrency memoization


【解决方案1】:

是的,那会很好。

静态变量在 Web 应用程序中的用途有限,因为它们由所有线程共享,并且需要锁定才能访问它们。

在这种情况下,您希望在所有线程之间共享字典,而ConcurrentDictionary 是线程安全的,因此它负责锁定。

【讨论】:

    【解决方案2】:

    您可以使用在 System.Runtime.Caching 中找到的 ObjectCache。它基本上用作 ASP.NET 缓存,不需要任何 System.Web 程序集的依赖。

    【讨论】:

      【解决方案3】:

      您可以将其缓存在网络服务器上。计算请求可以检查它是否存在于缓存中,然后调用你的程序集。

      否则是的,静态数学类应该在所有实例之间共享,但我从来都不是这样的粉丝。

      【讨论】:

      • 这个程序集有好几层深,不知道它是在 Web 服务器中执行的(这就是我特别提到的原因)。
      • 那么你说静态数学类应该在所有实例之间共享​​> - 是应该还是?我需要确定。
      • 也许我不清楚,您可以在 asp 代码/Web 应用程序上使用缓存,而不是在您的数学程序集中。在调用程序集进行计算之前,您的 Web 应用程序应检查 asp 缓存。
      • 实例是共享的,但是并发呢?
      • 我没有类似的参考模型:'web server -> math'。我有一个参考模型,例如:'Web 服务器 -> UI -> 业务 -> 分析 -> 计算 -> 数学' 根本没有检查 Web 缓存的选项。
      【解决方案4】:

      使用 Application 对象,然后您可以在应用程序级别访问它

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

      并且可以通过这个来检索它

      Application["name"]
      

      【讨论】:

      • Application 在哪个程序集中?我不想在数学程序集中添加对 Application 对象的引用,所以除非它在 ​​System 中(我看不到它),否则这将无法工作......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      • 2020-10-25
      • 2012-01-03
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多