次の方法で共有


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

プロパティ値

コントロールの 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呼び出しを行う」を参照してください。

適用対象

こちらもご覧ください