Control.InvokeRequired Eigenschaft
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Ruft einen Wert ab, der angibt, ob der Aufrufer eine Aufrufmethode aufrufen muss, wenn Methodenaufrufe an das Steuerelement ausgeführt werden, da sich der Aufrufer in einem anderen Thread befindet als das Steuerelement, für das 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 Steuerelement Handle in einem anderen Thread als der aufrufende Thread erstellt wurde (was angibt, dass Sie Aufrufe an das Steuerelement über eine Aufrufmethode vornehmen müssen); andernfalls false.
Implementiert
- Attribute
Hinweise
Steuerelemente in Windows Forms sind an einen bestimmten Thread gebunden und sind 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 festzustellen, ob Sie eine Aufrufmethode aufrufen müssen, was hilfreich sein kann, wenn Sie nicht wissen, welcher Thread ein Steuerelement besitzt.
Hinweis
Zusätzlich zur InvokeRequired Eigenschaft gibt es vier Methoden für ein Steuerelement, das threadsicher aufgerufen werden kann: Invoke,BeginInvoke, EndInvoke und CreateGraphics wenn das Handle für das Steuerelement bereits erstellt wurde. Das Aufrufen CreateGraphics , bevor der Handle des Steuerelements in einem Hintergrundthread erstellt wurde, kann zu unzulässigen Threadaufrufen führen. Für alle anderen Methodenaufrufe sollten Sie beim Aufrufen von einem anderen Thread eine dieser Aufrufmethoden verwenden.
Wenn der Steuerpunkt des Steuerelements noch nicht vorhanden ist, wird die übergeordnete Kette des Steuerelements durchsucht, InvokeRequired bis es ein Steuerelement oder Formular findet, das über ein Fensterhandle verfügt. Wenn kein entsprechender Handle gefunden werden kann, gibt die InvokeRequired Methode zurück false.
Dies bedeutet, dass zurückgegeben InvokeRequiredfalse werden kann, wenn Invoke es 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 der Steuerpunkt des Steuerelements im Hintergrundthread erstellt wird, das Steuerelement auf einem Thread ohne Meldungspumpe isoliert und die Anwendung instabil macht.
Sie können diesen Fall schützen, indem Sie auch den Wert der IsHandleCreated Rückgabe InvokeRequiredfalse in einem Hintergrundthread überprüfen. Wenn das Steuerelementhandle noch nicht erstellt wurde, müssen Sie warten, bis es vor dem Aufrufen oder BeginInvokeaufrufen Invoke erstellt wurde. Dies geschieht in der Regel nur, wenn im Konstruktor des primären Formulars für die Anwendung ein Hintergrundthread 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 der Handle des Formulars erstellt wurde, bevor der Hintergrundthread gestartet wird. Erzwingen Sie entweder die Erstellung durch Aufrufen der Handle Eigenschaft, oder warten Sie, bis das Load Ereignis den Hintergrundprozess startet.
Eine noch bessere Lösung besteht darin, die SynchronizationContext zurückgegebene SynchronizationContext Lösung anstelle eines Steuerelements für das Crossthread-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-Steuerelementen für Windows Forms finden Sie unter How to: Use a Background Thread to Search for Files and How to: Make Thread-Safe Calls to Windows Forms Controls.