Control.InvokeRequired プロパティ

定義

呼び出し元がコントロールの作成されたスレッドと異なるスレッド上にあるため、コントロールに対してメソッドの呼び出しを実行するときに、呼び出し元で 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

プロパティ値

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 プロパティに加えて、コントロールのハンドルが既に作成されている場合は、InvokeBeginInvokeCreateGraphics EndInvoke の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.

つまり、InvokeRequiredInvoke が不要な場合 (同じスレッドで呼び出された場合)、またはコントロールのハンドルがまだ作成されていない場合に、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.

この場合は、InvokeRequired がバックグラウンドスレッドで false を返したときに IsHandleCreated の値も確認することで保護できます。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 が呼び出された前に、アプリケーションのプライマリフォームのコンストラクターにバックグラウンドスレッドが作成された場合のみです (Application.Run(new MainForm())の場合)。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.

適用対象

こちらもご覧ください