3

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

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

但是HttpApplicationState.Lock 方法的文档并没有确切地告诉我它的作用。

例如:

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

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

除了防止多个线程同时写入数据外,还有助于防止一个线程在另一个线程正在写入时读取;否则,第一个线程可能认为它需要在不需要时刷新数据。我想限制执行刷新的次数。

4

1 回答 1

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建议这样做,其次因为对应用程序静态数据的读/写是调用每次访问的锁定数据。

于 2012-10-26T23:08:21.873 回答