RouteCollection.GetReadLock メソッド

定義

コレクションからオブジェクトを取得するときにスレッド セーフを管理するためのオブジェクトを提供します。

public:
 IDisposable ^ GetReadLock();
public IDisposable GetReadLock();
member this.GetReadLock : unit -> IDisposable
Public Function GetReadLock () As IDisposable

返品

スレッド セーフを管理するオブジェクト。

次の例は、アプリケーションの実行中にルートを取得するときに、 GetReadLock メソッドを使用する方法を示しています。 Using ステートメントを使用すると、コレクションから読み取ったときに実行時に何が起こっても (コードが正常に完了するか、例外がスローされるか)、ロックはUsingコード ブロックの最後に安全に解放されます。

注釈

RouteCollection オブジェクトは、アプリケーション内の複数のプロセスで使用できます。 そのため、アプリケーションの実行中にルートを取得する必要がある場合は、スレッド セーフを保証するために GetReadLock メソッドを使用します。 ルート コレクションの読み取りロックを取得することで、コレクションを取得しようとしている間にコレクションが変更されないようにします。

GetReadLock メソッドは、ロックを取得できるようになるまでスレッドの継続を停止します。 書き込みロックが設定されている場合、スレッドは更新が完了し、書き込みロックが解放されるまで待機します。 ルート コレクションの読み取りロックは、このメソッドによって返される IDisposable オブジェクトが破棄されるときに解放されます。

GetReadLockを使用しない場合は、RouteCollection コレクションの読み取り中にエラーが発生する可能性があります。 たとえば、RouteCollectionを呼び出さずに、GetReadLock コレクション内のオブジェクトをループして読み取るとします。 これを行っている間に、別の要求の別のスレッドが GetWriteLock を呼び出して、コレクションにルートを追加する可能性があります。 その後、最初のスレッドはエラーで失敗します。

GetReadLockを呼び出す必要がないシナリオは 2 つあります。

  • RouteCollectionGetVirtualPath呼び出しなどのGetRouteData クラスのパブリック メソッドGetReadLock内部的に。 したがって、GetReadLock クラスのパブリック メソッドを呼び出してコレクションからデータを取得するときに、RouteCollectionを明示的に呼び出す必要はありません。

  • アプリケーションが起動中で、 Application_Start イベント ハンドラーなどの要求をまだ処理していない場合は、1 つのスレッドのみが実行されます。 コレクションの読み取り中にコレクションを更新する可能性のあるスレッドは他にないため、 GetReadLockを呼び出す必要はありません。

適用対象

こちらもご覧ください