2012-10-26 168 views
3

我的应用程序在应用程序状态下存储两个相关的数据位。每次我读这两个值时,我都可能(取决于它们的值)更新它们。HttpApplicationState.Lock究竟做了什么?

因此,为了防止在另一个线程正在读取它们时更新它们,我正在锁定应用程序状态。

HttpApplicationState.Lock Method的文档确实没有告诉我它到底做了什么。

例如:

  1. 它是如何锁定?它是否阻止任何其他线程写入数据?

  2. 它是否也阻止读取访问?如果不是,那么这个练习是没有意义的,因为在另一个线程读取第一个值之后但在读取第二个值之前,这两个值可以被更新。

除了防止多个线程同时写入数据,是有帮助的也防止一个线程从阅读,而另一个线程正在写入;否则,第一个线程可能会认为在不需要时需要刷新数据。我想限制执行刷新的次数。

回答

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

其更好地避免使用存储数据的应用程序,而直接使用你的锁止机构的静态成员,因为首先MS的建议它,其次是因为对应用程序静态数据的读/写是在每次访问数据时调用锁定。

+0

如果是这样,除了将两个项目存储在同一个对象中之外,似乎没有任何方法可以让我的两个数据在读取时保持同步。 –

+0

@JonathanWood我说你可以锁定你什么时候读数据,以避免别人写他们并改变他们。其余所有的都是同步的,并且它们是线程安全的 – Aristos

+0

你能告诉我锁是如何工作的吗? '_lock.AcquireWrite()'是否阻止任何其他尝试写入的线程? –