このページは役に立ちましたか。
このページのコンテンツについての ご意見をお待ちしております
その他にご意見はありますか。
残り 1500 文字
エクスポート (0) 印刷
すべて展開

Monitor クラス

更新 : 2007 年 11 月

オブジェクトへのアクセスを同期する機構を提供します。

名前空間 :  System.Threading
アセンブリ :  mscorlib (mscorlib.dll 内)

[ComVisibleAttribute(true)]
[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
	ExternalThreading = true)]
public static class Monitor
/** @attribute ComVisibleAttribute(true) */
/** @attribute HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true) */
public final class Monitor
public final class Monitor

メモ :

この型またはメンバに適用される HostProtectionAttribute 属性の Resources プロパティの値は、Synchronization | ExternalThreading です。HostProtectionAttribute は、デスクトップ アプリケーション (通常、アイコンのダブルクリック、コマンドの入力、またはブラウザへの URL の入力により起動されます) には影響しません。詳細については、HostProtectionAttribute クラスのトピックまたは「SQL Server プログラミングとホスト保護属性」を参照してください。

Monitor クラスは、オブジェクトのロックをシングル スレッドに付与してオブジェクトへのアクセスを制御します。オブジェクトをロックすると、通常クリティカル セクションと呼ばれる、コード ブロックへのアクセスを制限できます。あるスレッドがオブジェクトのロックを所有している間、他のスレッドはそのロックを取得できません。Monitor を使用して、ロックの所有者が実行しているアプリケーション コードのセクションに、他のスレッドがアクセスできないようにすることもできます。ただし、これは、他のスレッドがロックされた別のオブジェクトを使用してコードを実行していない場合に限ります。

メモ :

値型ではなく、オブジェクト (つまり参照型) をロックするには Monitor を使用します。詳細については、「Enter」および概念に関するトピック「Monitor」を参照してください。

Monitor には次の機能があります。

  • 必要に応じてオブジェクトに関連付けられます。

  • 非バインドです。つまり、任意のコンテキストから直接呼び出すことができます。

  • Monitor クラスのインスタンスは作成できません。

同期するオブジェクトごとに次の情報が保持されます。

  • 現在ロックを保持しているスレッドへの参照。

  • 実行待ちキューへの参照。実行待ちキューにはロックの取得が準備できたスレッドが格納されます。

  • 待機キューへの参照。このキューには、ロックされたオブジェクトの状態が変更されたことの通知を待機しているスレッドが格納されます。

同期するオブジェクトにアクセスするスレッドが実行できるアクションについて、次の表で説明します。

アクション

説明

Enter, TryEnter

オブジェクトのロックを取得します。このアクションは、クリティカル セクションの先頭もマークします。他のスレッドは、ロックされた別のオブジェクトを使用してクリティカル セクションで命令を実行している場合を除き、クリティカル セクションに入ることはできません。

Wait

オブジェクトのロックを解放して、他のスレッドがオブジェクトをロックしたりオブジェクトにアクセスできるようにします。呼び出し元のスレッドは、他のスレッドがオブジェクトにアクセスしている間待機します。パルス シグナルを使用して、オブジェクトの状態が変更されたことを待機中のスレッドに通知します。

Pulse (シグナル)、PulseAll

1 つ以上の待機中のスレッドにシグナルを送ります。このシグナルが、ロックされたオブジェクトの状態が変更されたことを待機中のスレッドに通知すると、ロックの所有者はロックを解放する準備をします。待機中のスレッドはオブジェクトの実行待ちキューに入り、最終的にオブジェクトのロックを受け取ることができます。ロックを取得したスレッドは、必要な状態に達しているかどうかを確認するためにオブジェクトの新しい状態をチェックできます。

Exit

オブジェクトのロックを解放します。このアクションは、ロックされたオブジェクトによってプロテクトされるクリティカル セクションの末尾もマークします。

Enter メソッドと Exit メソッドを使用して、クリティカル セクションの先頭と末尾をマークします。クリティカル セクションが連続する命令のセットである場合は、Enter メソッドで取得したロックにより、ロックされたオブジェクトで囲まれたコードを 1 つのシングル スレッドだけが実行できるようになります。この場合は、try ブロックにこれらの命令を置いて、Exit 命令を finally ブロックに置くことをお勧めします。この機能は、通常、クラスの静的メソッドまたはインスタンス メソッドへのアクセスを同期するために使用されます。インスタンス メソッドに同期されたスレッド アクセスが必要な場合は、現在のインスタンスをロックするオブジェクトとして使用して、Enter メソッドと、対応する Exit メソッドを呼び出します。1 つのスレッドだけが現在のインスタンスのロックを保持できるため、このメソッドを実行できるのは、一度に 1 つのスレッドだけです。静的メソッドは、現在のインスタンスの Type をロックされたオブジェクトとして使用するのと同じ方法でプロテクトされます。Enter および Exit メソッドによって提供される機能は、C# lock ステートメント (Visual Basic の場合は SyncLock) によって提供される機能と似ています。唯一の相違点は、lock および SyncLock がモニタを確実に解放するために、Exit メソッドを try...finally ブロック (Visual Basic の場合は Try...Finally) 内にラップすることです。

クリティカル セクションの範囲がメソッド全体にわたる場合、前のロック機能は System.Runtime.CompilerServices.MethodImplAttribute をメソッドに配置し、MethodImplAttribute のコンストラクタの Synchronized 値を指定して実行できます。この属性を使用する場合は、Enter ステートメントと Exit ステートメントは不要です。この属性によって、現在のスレッドはメソッドから制御が戻るまでロックを保持します。ロックがすぐに解放できる場合は、この属性ではなく、Monitor クラスまたは C# lock ステートメントを使用します。

特定のオブジェクトをロックおよび解放する Enter ステートメントと Exit ステートメントは、メンバの境界またはクラスの境界、またはその両方を超えることはできますが、この方法はお勧めできません。

同期対象のオブジェクトを選択する場合は、プライベート オブジェクトまたは内部オブジェクトだけをロックする必要があります。外部オブジェクトをロックすると、デッドロックが発生します。これは関連のないコードが別の目的のために同じオブジェクトのロックを選択するためです。

System.Object
  System.Threading.Monitor

この型は、スレッド セーフです。

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC, Xbox 360

.NET Framework および .NET Compact Framework では、各プラットフォームのすべてのバージョンはサポートしていません。サポートされているバージョンについては、「.NET Framework システム要件」を参照してください。

.NET Framework

サポート対象 : 3.5、3.0、2.0、1.1、1.0

.NET Compact Framework

サポート対象 : 3.5、2.0、1.0

XNA Framework

サポート対象 : 2.0、1.0

コミュニティの追加

追加
表示:
© 2015 Microsoft