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. そのため、別のスレッドからコントロールのメソッドを呼び出す場合をする必要がありますを使用して、いずれかのコントロールの適切なスレッドの呼び出しをマーシャ リングするメソッドの呼び出し。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プロパティ、コントロールのスレッドの呼び出しは安全である 4 つのメソッドがある: InvokeBeginInvokeEndInvokeCreateGraphicsコントロールのハンドルが既に作成されている場合。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返すことができますfalse場合Invokeは必要ありません (呼び出しは、同じスレッドで発生します)、またはコントロールが別のスレッドで作成されましたが、コントロールのハンドルが作成されていない場合。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ときInvokeRequired返しますfalseバック グラウンド スレッドでします。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.

適用対象

こちらもご覧ください