Control.InvokeRequired プロパティ

定義

呼び出し元がコントロールの作成されたスレッドと異なるスレッド上にあるため、コントロールに対してメソッドの呼び出しを実行するときに、呼び出し元で invoke メソッドを呼び出す必要があるかどうかを示す値を取得します。

[System.ComponentModel.Browsable(false)]
public bool InvokeRequired { get; }

プロパティ値

コントロールの true が、呼び出し元スレッドと異なるスレッド上で作成された (invoke メソッドを通じてコントロールを呼び出す必要があることを示す) 場合は Handle。それ以外の場合は false

実装

属性

注釈

Windows フォーム内のコントロールは特定のスレッドにバインドされ、スレッド セーフではありません。 したがって、別のスレッドからコントロールのメソッドを呼び出す場合は、コントロールの呼び出しメソッドのいずれかを使用して、適切なスレッドへの呼び出しをマーシャリングする必要があります。 このプロパティを使用して、呼び出しメソッドを呼び出す必要があるかどうかを判断できます。これは、コントロールを所有するスレッドがわからない場合に便利です。

注意

プロパティにInvokeRequired加えて、呼び出 EndInvokeInvokeBeginInvokeすスレッド セーフなコントロールには 4 つのメソッドがあります。コントロールCreateGraphicsのハンドルが既に作成されている場合は 、。 バックグラウンド スレッドでコントロールのハンドルが作成される前に を呼び出 CreateGraphics すと、スレッド間の呼び出しが無効になる可能性があります。 他のすべてのメソッド呼び出しでは、別のスレッドから を呼び出すときに、これらの呼び出しメソッドのいずれかを使用する必要があります。

コントロールのハンドルがまだ存在しない場合は、 InvokeRequired ウィンドウ ハンドルを持つコントロールまたはフォームが見つかるまで、コントロールの親チェーンを検索します。 適切なハンドルが見つからない場合、 メソッドは を InvokeRequired 返します false

つまりInvokeRequired、 が必要でない場合 Invoke (呼び出しは同じスレッドで行われます)、またはコントロールが別のスレッドで作成されたが、コントロールのハンドルがまだ作成されていない場合は、 を返falseすことができます。

コントロールのハンドルがまだ作成されていない場合は、単にコントロールのプロパティ、メソッド、またはイベントを呼び出すべきではありません。 これにより、コントロールのハンドルがバックグラウンド スレッドに作成され、メッセージ ポンプのないスレッドでコントロールが分離され、アプリケーションが不安定になる可能性があります。

このケースから保護するには、バックグラウンド スレッドで が返falseされたときに InvokeRequiredIsHandleCreated値も確認します。 コントロール ハンドルがまだ作成されていない場合は、 または BeginInvokeを呼び出すInvoke前に、作成されるまで待つ必要があります。 通常、これは、アプリケーションのプライマリ フォームのコンストラクターでバックグラウンド スレッドが作成された場合にのみ発生します ( Application.Run(new MainForm())フォームが表示される前または Application.Run 呼び出される前)。

1 つの解決策は、フォームのハンドルが作成されるまで待ってから、バックグラウンド スレッドを開始することです。 プロパティを呼び出してハンドルの作成を Handle 強制するか、イベントがバックグラウンド プロセスを Load 開始するまで待ちます。

さらに優れた解決策は、スレッド間マーシャリングのコントロールではなく、 によってSynchronizationContext返される を使用SynchronizationContextすることです。

注意

メッセージを処理するスレッドがアクティブでなくなった場合は、例外がスローされることがあります。

マルチスレッド Windows フォーム コントロールの詳細については、「方法: バックグラウンド スレッドを使用してファイルを検索する」および「方法: Windows フォーム コントロールへのThread-Safe呼び出しを行う」を参照してください。

適用対象

製品 バージョン
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Windows Desktop 3.0, 3.1, 5, 6, 7, 8, 9, 10

こちらもご覧ください