我的应用程序将两个相关的数据位存储在应用程序状态中。每当我读取这两个值时,我可能(取决于它们的值)需要更新它们。
因此,为了防止在另一个线程正在读取它们的同时更新它们,我正在锁定应用程序状态。
但是HttpApplicationState.Lock Method的文档实际上并没有告诉我它究竟是做什么的。
例如:
它如何锁定?它会阻止任何其他线程写入数据吗?
是否还会阻止读取权限?如果没有,那么这个练习毫无意义,因为在另一个线程读取了第一个值之后但在读取了第二个值之前,这两个值可以更新。
除了防止多个线程同时写入数据之外,在另一个线程正在写入的同时防止线程读取也是有帮助的。否则,第一个线程可能认为在没有必要时需要刷新数据。我想限制执行刷新的次数。
答案 0 :(得分:1)
查看代码只锁定写入,而不是读取。
public void Lock()
{
this._lock.AcquireWrite();
}
public void UnLock()
{
this._lock.ReleaseWrite();
}
public object this[string name]
{
get
{
return this.Get(name);
}
set
{
// here is the effect on the lock
this.Set(name, value);
}
}
public void Set(string name, object value)
{
this._lock.AcquireWrite();
try
{
base.BaseSet(name, value);
}
finally
{
this._lock.ReleaseWrite();
}
}
public object Get(string name)
{
object obj2 = null;
this._lock.AcquireRead();
try
{
obj2 = base.BaseGet(name);
}
finally
{
this._lock.ReleaseRead();
}
return obj2;
}
写入和读取是线程安全的,这意味着已准备好锁定机制。因此,如果你继续读取数据的循环,你可以将其锁定在外面以防止其他破坏列表。
阅读这个答案也很好:Using static variables instead of Application state in ASP.NET
最好避免使用Application来存储数据,并直接使用带有锁机制的静态成员,因为首先是MS建议它,第二是因为对应用程序静态数据的读/写是每次调用锁定访问数据。