Control.InvokeRequired Control.InvokeRequired Control.InvokeRequired Control.InvokeRequired Property

定義

呼び出し元がコントロールの作成されたスレッドと異なるスレッド上にあるため、コントロールに対してメソッドの呼び出しを実行するときに、呼び出し元で invoke メソッドを呼び出す必要があるかどうかを示す値を取得します。Gets a value indicating whether the caller must call an invoke method when making method calls to the control because the caller is on a different thread than the one the control was created on.

public:
 property bool InvokeRequired { bool get(); };
[System.ComponentModel.Browsable(false)]
public bool InvokeRequired { get; }
member this.InvokeRequired : bool
Public ReadOnly Property InvokeRequired As Boolean

プロパティ値

コントロールの true が、呼び出し元スレッドと異なるスレッド上で作成された (invoke メソッドを通じてコントロールを呼び出す必要があることを示す) 場合は Handle。それ以外の場合は falsetrue if the control's Handle was created on a different thread than the calling thread (indicating that you must make calls to the control through an invoke method); otherwise, false.

実装

注釈

Windows フォームのコントロールは特定のスレッドにバインドされ、スレッドセーフではありません。Controls in Windows Forms are bound to a specific thread and are not thread safe. そのため、別のスレッドからコントロールのメソッドを呼び出している場合は、コントロールの invoke メソッドの1つを使用して、適切なスレッドへの呼び出しをマーシャリングする必要があります。Therefore, if you are calling a control's method from a different thread, you must use one of the control's invoke methods to marshal the call to the proper thread. このプロパティを使用して、invoke メソッドを呼び出す必要があるかどうかを判断できます。これは、どのスレッドがコントロールを所有しているかわからない場合に便利です。This property can be used to determine if you must call an invoke method, which can be useful if you do not know what thread owns a control.

注意

InvokeRequiredプロパティに加えて、、、、 EndInvokeおよびCreateGraphicsコントロールのハンドルが既に作成されているInvoke場合BeginInvoke、を呼び出すためにスレッドセーフであるコントロールには、次の4つのメソッドがあります。In addition to the InvokeRequired property, there are four methods on a control that are thread safe to call: Invoke,BeginInvoke, EndInvoke and CreateGraphics if the handle for the control has already been created. バックグラウンドCreateGraphicsスレッドでコントロールのハンドルが作成される前にを呼び出すと、無効なクロススレッド呼び出しが発生する可能性があります。Calling CreateGraphics before the control's handle has been created on a background thread can cause illegal cross thread calls. 他のすべてのメソッド呼び出しでは、別のスレッドからを呼び出すときに、これらの呼び出しメソッドのいずれかを使用する必要があります。For all other method calls, you should use one of these invoke methods when calling from a different thread.

コントロールのハンドルがまだ存在しない場合はInvokeRequired 、ウィンドウハンドルを持つコントロールまたはフォームが見つかるまで、によってコントロールの親チェーンが検索されます。If the control's handle does not yet exist, InvokeRequired searches up the control's parent chain until it finds a control or form that does have a window handle. 適切なハンドルが見つからない場合、メソッドInvokeRequiredはをfalse返します。If no appropriate handle can be found, the InvokeRequired method returns false.

これは、 InvokeRequiredが不要なInvoke場合 (呼び出しが同じスレッドで発生した場合)、またはコントロールが別のスレッドで作成されていても、コントロールのハンドルがまだ作成されていない場合にを返すfalse可能性があることを意味します。This means that InvokeRequired can return false if Invoke is not required (the call occurs on the same thread), or if the control was created on a different thread but the control's handle has not yet been created.

コントロールのハンドルがまだ作成されていない場合は、単にコントロールのプロパティ、メソッド、またはイベントを呼び出さないようにする必要があります。In the case where the control's handle has not yet been created, you should not simply call properties, methods, or events on the control. これにより、コントロールのハンドルがバックグラウンドスレッドで作成され、メッセージポンプがなくても、アプリケーションが不安定になる可能性があります。This might cause the control's handle to be created on the background thread, isolating the control on a thread without a message pump and making the application unstable.

この場合は、がバックグラウンドスレッドでを返しIsHandleCreated falseたときInvokeRequiredにの値も確認することで保護できます。You can protect against this case by also checking the value of IsHandleCreated when InvokeRequired returns false on a background thread. コントロールハンドルがまだ作成されていない場合は、またはInvoke BeginInvokeを呼び出す前に、コントロールハンドルが作成されるまで待機する必要があります。If the control handle has not yet been created, you must wait until it has been created before calling Invoke or BeginInvoke. 通常、このエラーは、フォームが表示される前Application.Run(new MainForm())、またApplication.Runは呼び出される前に、アプリケーションのプライマリフォームのコンストラクターにバックグラウンドスレッドが作成された場合にのみ発生します。Typically, this happens only if a background thread is created in the constructor of the primary form for the application (as in Application.Run(new MainForm()), before the form has been shown or Application.Run has been called.

1つの解決策は、バックグラウンドスレッドを開始する前に、フォームのハンドルが作成されるまで待機することです。One solution is to wait until the form's handle has been created before starting the background thread. Handleプロパティを呼び出してハンドルを強制的に作成するか、イベントLoadがバックグラウンドプロセスを開始するまで待機します。Either force handle creation by calling the Handle property, or wait until the Load event to start the background process.

さらに優れた解決策は、 SynchronizationContextスレッド間SynchronizationContextのマーシャリングの制御ではなく、によって返されるを使用することです。An even better solution is to use the SynchronizationContext returned by SynchronizationContext rather than a control for cross-thread marshaling.

注意

メッセージを処理する必要があるスレッドがアクティブでなくなった場合は、例外がスローされる可能性があります。An exception might be thrown if the thread that should process the message is no longer active.

マルチスレッド Windows フォームコントロールの詳細については、「」を参照してください。バックグラウンドスレッドを使用してファイルを検索し、 次の操作を行います。Windows フォームコントロールに対してスレッドセーフな呼び出しを行います。For more information about multithreaded Windows Forms controls, see How to: Use a Background Thread to Search for Files and How to: Make Thread-Safe Calls to Windows Forms Controls.

適用対象

こちらもご覧ください