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.

public:
 property bool InvokeRequired { bool get(); };
[System.ComponentModel.Browsable(false)]
public bool InvokeRequired { get; }
[<System.ComponentModel.Browsable(false)>]
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.

Implementiert

Attribute

Hinweise

Steuerelemente in Windows Forms sind an einen bestimmten Thread gebunden und nicht threadsicher. Wenn Sie daher die -Methode eines Steuerelements aus einem anderen Thread aufrufen, müssen Sie eine der Aufrufmethoden des Steuerelements verwenden, um den Aufruf an den richtigen Thread zu marshallen. Diese Eigenschaft kann verwendet werden, um zu bestimmen, ob Sie eine Invoke-Methode aufrufen müssen. Dies kann nützlich sein, wenn Sie nicht wissen, welcher Thread ein Steuerelement besitzt.

Hinweis

Zusätzlich zur InvokeRequired -Eigenschaft gibt es vier Methoden für ein Steuerelement, die threadsicher aufgerufen werden können: Invoke,BeginInvoke undCreateGraphics, EndInvoke wenn das Handle für das Steuerelement bereits erstellt wurde. Das Aufrufen CreateGraphics , bevor das Handle des Steuerelements in einem Hintergrundthread erstellt wurde, kann zu unzulässigen threadübergreifenden Aufrufen führen. Für alle anderen Methodenaufrufe sollten Sie eine dieser Aufrufmethoden verwenden, wenn Sie aus einem anderen Thread aufrufen.

Wenn das Handle des Steuerelements noch nicht vorhanden ist, durchsucht die übergeordnete Kette des Steuerelements, InvokeRequired bis ein Steuerelement oder Formular gefunden wird, das über ein Fensterhandle verfügt. Wenn kein geeignetes Handle gefunden werden kann, gibt die InvokeRequired -Methode zurück false.

Dies bedeutet, dass InvokeRequired zurückgeben false kann, wenn Invoke nicht erforderlich ist (der Aufruf erfolgt im selben Thread), oder wenn das Steuerelement in einem anderen Thread erstellt wurde, aber das Handle des Steuerelements noch nicht erstellt wurde.

Wenn das Handle des Steuerelements noch nicht erstellt wurde, sollten Sie nicht einfach Eigenschaften, Methoden oder Ereignisse für das Steuerelement aufrufen. Dies kann dazu führen, dass das Handle des Steuerelements im Hintergrundthread erstellt wird, das Steuerelement in einem Thread ohne Nachrichtenpumpe isoliert und die Anwendung instabil wird.

Sie können sich vor diesem Fall schützen, indem Sie auch den Wert von IsHandleCreated überprüfen, wenn InvokeRequired in einem Hintergrundthread zurückgegeben wird false . Wenn das Steuerelementhandle noch nicht erstellt wurde, müssen Sie warten, bis es erstellt wurde, bevor Sie oder BeginInvokeaufrufenInvoke. In der Regel geschieht dies nur, wenn ein Hintergrundthread im Konstruktor des primären Formulars für die Anwendung erstellt wird (wie in Application.Run(new MainForm()), bevor das Formular angezeigt oder Application.Run aufgerufen wurde.

Eine Lösung besteht darin, zu warten, bis das Handle des Formulars erstellt wurde, bevor der Hintergrundthread gestartet wird. Erzwingen Sie entweder die Handleerstellung, indem Sie die Handle -Eigenschaft aufrufen, oder warten Sie, bis das Load Ereignis den Hintergrundprozess startet.

Eine noch bessere Lösung besteht darin, das SynchronizationContext zurückgegebene von SynchronizationContext anstelle eines Steuerelements für das Threadübergreifende Marshalling zu verwenden.

Hinweis

Eine Ausnahme kann ausgelöst werden, wenn der Thread, der die Nachricht verarbeiten soll, nicht mehr aktiv ist.

Weitere Informationen zu Multithread-Windows Forms-Steuerelementen finden Sie unter Vorgehensweise: Verwenden eines Hintergrundthreads zum Suchen nach Dateien und Vorgehensweise: Ausführen von Thread-Safe Aufrufen von Windows Forms-Steuerelementen.

Gilt für:

Weitere Informationen