3

私のアプリケーションは、関連する 2 つのデータ ビットをアプリケーション状態に保存します。これら 2 つの値を読み取るたびに、(値によっては) 両方を更新する必要がある場合があります。

そのため、別のスレッドが読み取り中に更新されないようにするために、アプリケーションの状態をロックしています。

しかし、 HttpApplicationState.Lock メソッドのドキュメントでは、それが何をするのか正確にはわかりません。

例えば:

  1. どのようにロックしますか?他のスレッドがデータを書き込むのをブロックしますか?

  2. 読み取りアクセスもブロックしますか? そうでない場合、別のスレッドが最初の値を読み取った後、2 番目の値を読み取る前に 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

アプリケーションを使用してデータを保存することは避け、ロックメカニズムで静的メンバーを直接使用することをお勧めします.データ。

于 2012-10-26T23:08:21.873 に答える