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

Definition

Ruft einen Wert ab, der angibt ob der Aufrufer beim Aufruf von Methoden des Steuerelements eine Aufrufmethode aufrufen muss, da sich der Aufrufer in einem anderen Thread als dem befindet, in dem das Steuerelement erstellt wurde.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

Eigenschaftswert

true, wenn das Handle des Steuerelements in einem anderen Thread als dem aufrufenden Thread erstellt wurde, sodass Aufrufe des Steuerelements durch eine Aufrufmethode erfolgen müssen), andernfalls false.true 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.

Implementiert

Hinweise

-Steuerelementen in Windows Forms gebunden sind, für einen bestimmten Thread und sind nicht threadsicher.Controls in Windows Forms are bound to a specific thread and are not thread safe. Aus diesem Grund, wenn Sie eine Methode des Steuerelements von einem anderen Thread aufrufen, müssen Sie verwenden eines des Steuerelements Aufrufen von Methoden, um den Aufruf an den richtigen Thread gemarshallt werden soll.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. Diese Eigenschaft kann verwendet werden, um festzustellen, ob Sie eine Aufrufmethode, die möglicherweise hilfreich aufrufen müssen, wenn Sie nicht wissen, welcher Thread im Besitz eines Steuerelements.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.

Hinweis

Zusätzlich zu den InvokeRequired -Eigenschaft, es gibt vier Methoden für ein Steuerelement threadsicher aufgerufen werden: Invoke,BeginInvoke, EndInvoke und CreateGraphics , wenn das Handle für das Steuerelement bereits erstellt wurde.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. Aufrufen von CreateGraphics vor dem das Handle des Steuerelements in einem Hintergrundthread erstellt wurde können dazu führen, dass unzulässigen threadübergreifenden aufrufen.Calling CreateGraphics before the control's handle has been created on a background thread can cause illegal cross thread calls. Alle anderen Aufrufe der Methode, sollten Sie mithilfe eines der folgenden Methoden aufrufen, wenn von einem anderen Thread aufrufen.For all other method calls, you should use one of these invoke methods when calling from a different thread.

Wenn das Handle des Steuerelements noch nicht vorhanden ist, InvokeRequired Suchvorgänge des Steuerelements übergeordnete Kette bis ein Steuerelement oder Formular, das ein Fensterhandle besitzt.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. Wenn kein entsprechendes Handle gefunden werden kann, die InvokeRequired Methodenrückgabe false.If no appropriate handle can be found, the InvokeRequired method returns false.

Dies bedeutet, dass InvokeRequired können zurückgeben false Wenn Invoke ist nicht erforderlich (der Aufruf erfolgt auf dem gleichen Thread), oder wenn das Steuerelement in einem anderen Thread erstellt wurde, aber das Handle des Steuerelements wurde noch nicht erstellt.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.

Im Fall, in dem das Handle des Steuerelements nicht noch erstellt wurde, sollten Sie nicht einfach Eigenschaften, Methoden oder Ereignisse für das Steuerelement aufrufen.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. Dies kann dazu führen, dass das Handle des Steuerelements im Hintergrundthread, der das Steuerelement in einem Thread ohne eine Meldungsverteilschleife zu isolieren und die Anwendung destabilisiert erstellt werden.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.

Schutz vor diesem Fall durch Überprüfen des Werts des IsHandleCreated beim InvokeRequired gibt false in einem Hintergrundthread.You can protect against this case by also checking the value of IsHandleCreated when InvokeRequired returns false on a background thread. Wenn das Handle des Steuerelements noch nicht erstellt wurde, müssen Sie warten, bis es vor dem Aufruf erstellt wurde Invoke oder BeginInvoke.If the control handle has not yet been created, you must wait until it has been created before calling Invoke or BeginInvoke. Dies geschieht in der Regel nur dann, wenn ein Hintergrundthread in den Konstruktor des primären Formulars für die Anwendung erstellt wird (wie in Application.Run(new MainForm()), bevor das Formular angezeigt wird oder Application.Run aufgerufen wurde.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.

Eine Lösung ist, warten, bis der Ziehpunkt erstellt wurde, bevor der Hintergrundthread zu starten.One solution is to wait until the form's handle has been created before starting the background thread. Erzwingen Sie Handle Erstellung durch Aufrufen der Handle Eigenschaft oder warten Sie, bis die Load Ereignis, um den Hintergrundprozess zu starten.Either force handle creation by calling the Handle property, or wait until the Load event to start the background process.

Eine noch bessere Lösung ist die Verwendung der SynchronizationContext zurückgegebenes SynchronizationContext anstatt ein Steuerelement für die threadübergreifendes Marshalling.An even better solution is to use the SynchronizationContext returned by SynchronizationContext rather than a control for cross-thread marshaling.

Hinweis

Eine Ausnahme kann ausgelöst werden, wenn der Thread, der die Nachricht zu verarbeiten, sollten nicht mehr aktiv ist.An exception might be thrown if the thread that should process the message is no longer active.

Weitere Informationen zu Multithreadanwendungen Windows Forms-Steuerelementen, finden Sie unter Vorgehensweise: Verwenden eines Hintergrundthreads zur Dateisuche und Vorgehensweise: Threadsichere Aufrufe von Windows Forms-Steuerelementen.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.

Gilt für:

Siehe auch