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