c# - asp.net缓存多线程锁webparts

标签 c# asp.net multithreading caching web-parts

我有以下情况:

假设我们有两个不同的 Web 部件对相同的数据进行操作 - 一个是饼图,另一个是数据表。 在其 Page_Load 中,它们从数据库异步加载数据,加载后将其放入应用程序缓存中以供其他 Web 部件进一步使用或使用。因此每个 Web 部件都有与此类似的代码:

protected void Page_Load(object sender, EventArgs e)
    { 
       if (Cache["dtMine" + "_" + Session["UserID"].ToString()]==null)
       {
         ...
         Page.RegisterAsyncTask(new PageAsyncTask(
             new BeginEventHandler(BeginGetByUserID),
             new EndEventHandler(EndGetByUserID), 
             null, args, true));
       }
      else 
       {
         get data from cache and bind to controls of the webpart
       }
    }

由于两个 Web 部件都对相同的数据进行操作,因此对我来说执行代码两次是没有意义的。

让一个 Web 部件与另一个 Web 部件通信的最佳方法是什么“我已经在获取数据,所以只需等到我将其放入缓存中”?

我一直在考虑互斥锁、锁定、为缓存项分配临时值并等待临时值更改...很多选项 - 我应该使用哪一个。

最佳答案

您需要利用 lock 关键字来确保数据以原子方式加载并添加到缓存中。

更新:

我修改了示例以尽可能短地保留访问 Cache 的锁。将存储代理,而不是将数据直接存储在缓存中。代理将以原子方式创建并添加到缓存中。然后,代理将使用自己的锁定来确保数据仅加载一次。

protected void Page_Load(object sender, EventArgs e)
{ 
   string key = "dtMine" + "_" + Session["UserID"].ToString();

   DataProxy proxy = null;

   lock (Cache)
   {
     proxy = Cache[key];
     if (proxy == null)
     {
       proxy = new DataProxy();
       Cache[key] = proxy;
     }
   }

   object data = proxy.GetData();
}

private class DataProxy
{
  private object data = null;

  public object GetData()
  {
    lock (this)
    {
      if (data == null)
      {
        data = LoadData(); // This is what actually loads the data.
      }
      return data;
    }
  }
}

关于c# - asp.net缓存多线程锁webparts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6296242/

相关文章:

c# - Process.Start() 对于 *.jpg 文件失败

c# - ObservableCollection - 无法更新 UI

asp.net - 使用 Elmah 捕获后台线程中的异常

html - 使用 Html 帮助程序显示工具提示

asp.net - 文件路径过长导致网站发布失败

java - 在android中的线程内设置TextView值

java - while循环和线程的无限循环问题

c# 重写对象中的 base 可以为 null 吗?

c# - 编写一个针对 LLVM 的 C# 编译器是否有意义?

css - 如何刷新 CSS 缓存?