我有以下情况:
假设我们有两个不同的 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/