次の方法で共有


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

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

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

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

適用対象

こちらもご覧ください