Control.InvokeRequired Eigenschaft

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

Attribute

Hinweise

Steuerelemente in Windows Forms sind an einen bestimmten Thread gebunden und sind nicht Thread sicher.Controls in Windows Forms are bound to a specific thread and are not thread safe. Wenn Sie also die-Methode eines Steuer Elements von einem anderen Thread aus aufrufen, müssen Sie eine der Aufruf Methoden des Steuer Elements verwenden, um den Aufruf an den richtigen Thread zu Mars Hallen.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 zu bestimmen, ob eine Aufruf Methode aufgerufen werden muss. Dies kann hilfreich sein, wenn Sie nicht wissen, welcher Thread das Steuerelement besitzt.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

Neben der InvokeRequired-Eigenschaft gibt es vier Methoden auf einem Steuerelement, die Thread sicher aufzurufen sind: 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. Wenn CreateGraphics aufgerufen wird, bevor das Handle des Steuer Elements in einem Hintergrund Thread erstellt wurde, kann dies zu ungültigen Thread übergreifenden aufrufen führen.Calling CreateGraphics before the control's handle has been created on a background thread can cause illegal cross thread calls. Für alle anderen Methodenaufrufe sollten Sie eine dieser Aufruf Methoden verwenden, wenn Sie 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 Steuer Elements noch nicht vorhanden ist, durchsucht InvokeRequired die übergeordnete Kette des Steuer Elements, bis ein Steuerelement oder ein Formular gefunden wird, das über ein Fenster Handle verfügt.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, gibt die InvokeRequired-Methode false zurück.If no appropriate handle can be found, the InvokeRequired method returns false.

Dies bedeutet, dass InvokeRequired false zurückgeben kann, wenn Invoke nicht erforderlich ist (der-Vorgang tritt im gleichen Thread auf) oder wenn das Steuerelement in einem anderen Thread erstellt wurde, das Handle des Steuer Elements jedoch noch nicht erstellt wurde.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.

Wenn das Handle des Steuer Elements noch nicht erstellt wurde, sollten Sie nicht einfach Eigenschaften, Methoden oder Ereignisse für das Steuerelement aufzurufen.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 könnte dazu führen, dass das Handle des Steuer Elements im Hintergrund Thread erstellt wird, wobei das Steuerelement in einem Thread ohne nachrichtenpump isoliert und die Anwendung instabil wird.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.

Sie können diesen Fall schützen, indem Sie auch den Wert IsHandleCreated überprüfen, wenn InvokeRequired false in einem Hintergrund Thread zurückgibt.You can protect against this case by also checking the value of IsHandleCreated when InvokeRequired returns false on a background thread. Wenn das Steuerungs Handle noch nicht erstellt wurde, müssen Sie warten, bis es erstellt wurde, bevor Sie Invoke oder BeginInvoke aufrufen.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, wenn ein Hintergrund Thread im 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 besteht darin, zu warten, bis das Handle des Formulars erstellt wurde, bevor der Hintergrund Thread gestartet wird.One solution is to wait until the form's handle has been created before starting the background thread. Erzwingen Sie die Erstellung des Handles, indem Sie die Handle-Eigenschaft aufrufen, oder warten Sie, bis das Load-Ereignis den Hintergrundprozess startet.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 besteht darin, den von SynchronizationContext zurückgegebenen SynchronizationContext anstelle eines Steuer Elements für Thread übergreifendes Marshalling zu verwenden.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 verarbeiten soll, nicht mehr aktiv ist.An exception might be thrown if the thread that should process the message is no longer active.

Weitere Informationen zu Multithread-Windows Forms Steuerelementen finden Sie unter gewusst wie: Verwenden Sie einen Hintergrund Thread, um nach Dateien zu suchen und Gewusst wie: Stellen Sie Thread sichere Aufrufe an Windows Forms Steuerelemente.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