更新 : 2007 年 11 月
呼び出し元がコントロールの作成されたスレッドと異なるスレッド上にあるため、コントロールに対してメソッドの呼び出しを実行するときに、呼び出し元で invoke メソッドを呼び出す必要があるかどうかを示す値を取得します。
名前空間 :
System.Windows.Forms アセンブリ :
System.Windows.Forms (System.Windows.Forms.dll 内)
<BrowsableAttribute(False)> _
Public ReadOnly Property InvokeRequired As Boolean
Dim instance As Control
Dim value As Boolean
value = instance.InvokeRequired
[BrowsableAttribute(false)]
public bool InvokeRequired { get; }
[BrowsableAttribute(false)]
public:
virtual property bool InvokeRequired {
bool get () sealed;
}
/** @property */
/** @attribute BrowsableAttribute(false) */
public final boolean get_InvokeRequired()
public final function get InvokeRequired () : boolean
プロパティ値
型 :
System..::.Boolean
コントロールの Handle が、呼び出し元スレッドと異なるスレッド上で作成された (invoke メソッドを通じてコントロールを呼び出す必要があることを示す) 場合は true。それ以外の場合は false。
実装
ISynchronizeInvoke..::.InvokeRequired
Windows フォーム内のコントロールは、特定のスレッドにバインドされているため、スレッド セーフではありません。したがって、異なるスレッドからコントロールのメソッドを呼び出す場合は、コントロールの invoke メソッドを使用して、適切なスレッドへの呼び出しをマーシャリングする必要があります。このプロパティを使用すると、invoke メソッドを呼び出す必要があるかどうかを確認できるため、どのスレッドがコントロールを所有しているかわからない場合に役立ちます。
メモ : |
|---|
コントロールのハンドルが既に作成されている場合、InvokeRequired プロパティ以外に、呼び出しに対してスレッド セーフである 4 つのメソッド Invoke、BeginInvoke、EndInvoke、および CreateGraphics がコントロールにあります。コントロールのハンドルがバックグラウンド スレッドで作成される前に CreateGraphics を呼び出すと、無効なスレッド間の呼び出しが発生する可能性があります。その他のすべてのメソッドの呼び出しについては、異なるスレッドから呼び出すときは、これらの invoke メソッドの 1 つを使用する必要があります。 |
コントロールのハンドルがまだ存在しない場合、InvokeRequired メソッドはコントロールの親チェインを検索し、ウィンドウ ハンドルを持つコントロールまたはフォームを見つけます。適切なハンドルが見つからない場合、InvokeRequired メソッドは false を返します。
つまり、Invoke が必須ではない (同じスレッドで呼び出しが行われる) 場合、またはコントロールが異なるスレッドで作成されるが、コントロールのハンドルがまだ作成されていない場合、InvokeRequired は false を返す可能性があります。
コントロールのハンドルがまだ作成されていない場合、コントロールでプロパティ、メソッド、またはイベントを呼び出さないでください。これにより、コントロールのハンドルがバックグラウンド スレッドで作成され、メッセージ ポンプのないスレッド上でコントロールが分離されて、アプリケーションが不安定になる可能性があります。
バックグラウンド スレッドで InvokeRequired が false を返す場合、IsHandleCreated の値を確認する方法でも、この状態が発生するのを回避できます。コントロール ハンドルがまだ作成されていない場合は、コントロール ハンドルが作成されるまで待機してから、Invoke または BeginInvoke を呼び出す必要があります。通常、これが発生するのは、アプリケーションのメイン フォームが表示される前または Application.Run が呼び出される前に、メイン フォームのコンストラクタでバックグラウンド スレッドが作成される場合です (たとえば、Application.Run(new MainForm()))。
1 つの解決策としては、フォームのハンドルが作成されるまで待機してから、バックグラウンド スレッドを開始します。Handle プロパティを呼び出してハンドルを強制的に作成するか、Load イベントがバックグラウンド プロセスを開始するまで待機します。
より優れた解決策としては、スレッド間のマーシャリングではなく、SynchronizationContext によって返される SynchronizationContext を使用します。
メモ : |
|---|
メッセージを処理するスレッドが既に非アクティブになっていた場合は、例外がスローされます。 |
マルチスレッド処理された Windows フォーム コントロールの詳細については、「方法 : バックグラウンド スレッドを使用してファイルを検索する」および「方法 : Windows フォーム コントロールのスレッド セーフな呼び出しを行う」を参照してください。
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
.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
参照