Control.InvokeRequired プロパティ

定義

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

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

プロパティ値

Boolean

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

実装

属性

注釈

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

注意

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

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

これは、 InvokeRequired false Invoke が不要な場合 (呼び出しが同じスレッドで発生した場合)、またはコントロールが別のスレッドで作成されていても、コントロールのハンドルがまだ作成されていない場合にを返す可能性があることを意味します。

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

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

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

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

注意

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

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

適用対象

こちらもご覧ください