HttpApplicationState.Lock究竟做了什么?

时间:2012-10-26 23:01:14

标签: asp.net application-state

我的应用程序将两个相关的数据位存储在应用程序状态中。每当我读取这两个值时,我可能(取决于它们的值)需要更新它们。

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

但是HttpApplicationState.Lock Method的文档实际上并没有告诉我它究竟是做什么的。

例如:

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

  2. 是否还会阻止读取权限?如果没有,那么这个练习毫无意义,因为在另一个线程读取了第一个值之后但在读取了第二个值之前,这两个值可以更新。

  3. 除了防止多个线程同时写入数据之外,在另一个线程正在写入的同时防止线程读取也是有帮助的。否则,第一个线程可能认为在没有必要时需要刷新数据。我想限制执行刷新的次数。

1 个答案:

答案 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建议它,第二是因为对应用程序静态数据的读/写是每次调用锁定访问数据。