Control.InvokeRequired プロパティ
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
呼び出し元がコントロールを作成したスレッドとは異なるスレッド上にあるため、呼び出し元がコントロールへのメソッド呼び出しを行うときに呼び出し元が呼び出しメソッドを呼び出す必要があるかどうかを示す値を取得します。
public:
property bool InvokeRequired { bool get(); };
[System.ComponentModel.Browsable(false)]
public bool InvokeRequired { get; }
[<System.ComponentModel.Browsable(false)>]
member this.InvokeRequired : bool
Public ReadOnly Property InvokeRequired As Boolean
プロパティ値
true 呼び出し元のスレッドとは異なるスレッドでコントロールの Handle が作成された場合 (呼び出しメソッドを使用してコントロールを呼び出す必要があることを示します)。それ以外の場合は false。
実装
- 属性
注釈
Windows フォームのコントロールは特定のスレッドにバインドされ、スレッド セーフではありません。 そのため、別のスレッドからコントロールのメソッドを呼び出す場合は、コントロールのいずれかの呼び出しメソッドを使用して、適切なスレッドへの呼び出しをマーシャリングする必要があります。 このプロパティを使用すると、呼び出しメソッドを呼び出す必要があるかどうかを判断できます。これは、コントロールを所有しているスレッドがわからない場合に便利です。
注
InvokeRequired プロパティに加えて、呼び出すスレッド セーフなコントロールには、Invoke、BeginInvoke、EndInvoke、コントロールのハンドルが既に作成されている場合にCreateGraphicsの 4 つのメソッドがあります。 バックグラウンド スレッドでコントロールのハンドルが作成される前に CreateGraphics を呼び出すと、スレッド間の呼び出しが無効になることがあります。 他のすべてのメソッド呼び出しでは、別のスレッドから呼び出すときに、これらの呼び出しメソッドのいずれかを使用する必要があります。
コントロールのハンドルがまだ存在しない場合、 InvokeRequired は、ウィンドウ ハンドルを持つコントロールまたはフォームが見つかるまで、コントロールの親チェーンを検索します。 適切なハンドルが見つからない場合、 InvokeRequired メソッドは falseを返します。
つまり、Invokeが不要な場合 (呼び出しは同じスレッドで行われます)、またはコントロールが別のスレッドで作成されたが、コントロールのハンドルがまだ作成されていない場合、InvokeRequiredはfalseを返すことができます。
コントロールのハンドルがまだ作成されていない場合は、単にコントロールのプロパティ、メソッド、またはイベントを呼び出すべきではありません。 これにより、バックグラウンド スレッドでコントロールのハンドルが作成され、メッセージ ポンプなしでスレッド上のコントロールが分離され、アプリケーションが不安定になる可能性があります。
また、バックグラウンド スレッドでfalseが返されたときにIsHandleCreatedの値InvokeRequiredチェックすることで、このケースから保護できます。 コントロール ハンドルがまだ作成されていない場合は、作成されるまで待ってから、 Invoke または BeginInvokeを呼び出す必要があります。 通常、これは、アプリケーションのプライマリ フォームのコンストラクターでバックグラウンド スレッドが作成された場合にのみ発生します ( Application.Run(new MainForm())のように、フォームが表示されるか、 Application.Run が呼び出される前)。
1 つの解決策は、フォームのハンドルが作成されるまで待機してから、バックグラウンド スレッドを開始することです。 Handle プロパティを呼び出してハンドルの作成を強制するか、Load イベントがバックグラウンド プロセスを開始するまで待機します。
さらに優れた解決策は、スレッド間マーシャリングのコントロールではなく、SynchronizationContextによって返されるSynchronizationContextを使用することです。
注
メッセージを処理するスレッドがアクティブでなくなった場合、例外がスローされる可能性があります。
マルチスレッド Windows フォーム コントロールの詳細については、「方法: バックグラウンド スレッドを使用してファイルを検索する」および「方法: Windows フォーム コントロールを Thread-Safe 呼び出す」を参照してください。