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 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 |
.NET に関するフィードバック
.NET はオープンソース プロジェクトです。 フィードバックを提供するにはリンクを選択します。