Control.InvokeRequired-Eigenschaft
Assembly: System.Windows.Forms (in system.windows.forms.dll)
Eigenschaftenwert
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.Steuerelemente in Windows Forms sind an einen bestimmten Thread gebunden und nicht threadsicher. Wenn Sie daher eine Methode des Steuerelements aus einem anderen Thread aufrufen, müssen Sie den Aufruf mithilfe einer der Aufrufmethoden des Steuerelements an den richtigen Thread marshallen. Anhand dieser Eigenschaft können Sie bestimmen, ob eine Aufrufmethode aufgerufen werden muss. Diese bietet sich an, wenn Sie nicht wissen, welcher Thread über ein Steuerelement verfügt.
Hinweis |
|---|
| Abgesehen von der InvokeRequired-Eigenschaft können vier Methoden in einem Steuerelement threadsicher aufgerufen werden: Invoke, BeginInvoke, EndInvoke und CreateGraphics. Für alle anderen Methodenaufrufe müssen Sie beim Aufrufen aus einem anderen Thread eine dieser Aufrufmethoden verwenden. |
Wenn das Handle des Steuerelements noch nicht vorhanden ist, durchsucht InvokeRequired die Kette der übergeordneten Elemente bis zu einem Steuerelement oder Formular, für das ein Fensterhandle vorhanden ist. Wenn kein entsprechendes Handle gefunden wird, gibt die InvokeRequired-Methode false zurück.
Dies bedeutet, dass InvokeRequiredfalse zurückgeben kann, wenn Invoke nicht erforderlich ist (der Aufruf erfolgt an denselben Thread) oder wenn das Steuerelement in einem anderen Thread erstellt wurde, jedoch das Handle für das Steuerelement noch nicht vorhanden ist.
Wenn das Handle des Steuerelements noch nicht erstellt wurde, sollten Sie Eigenschaften, Methoden oder Ereignisse für das Steuerelement nicht aufrufen. Dadurch könnte das Handle des Steuerelements im Hintergrundthread erstellt werden, womit das Steuerelement in einem Thread ohne Nachrichtenfilter isoliert und die Anwendung destabilisiert wird.
Sie können durch Überprüfen des Werts von IsHandleCreated diesem Fall vorbeugen, wenn InvokeRequired in einem Hintergrundthread false zurückgibt. Wenn das Steuerelementhandle noch nicht erstellt wurde, müssen Sie abwarten, bis dies erfolgt ist, bevor Sie Invoke oder BeginInvoke aufrufen. Dies erfolgt i. d. R. nur dann, 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 wird oder Application.Run aufgerufen wurde).
Eine Möglichkeit besteht darin, erst nach der Erstellung des Formularhandles den Hintergrundthread zu starten. Entweder erzwingen Sie die Handleerstellung durch Aufrufen der Handle-Eigenschaft, oder Sie warten, bis das Load-Ereignis den Hintergrundprozess startet.
Eine noch bessere Lösung besteht darin, statt einem Steuerelement für threadübergreifendes Marshallen den SynchronizationContext zu verwenden, der von SynchronizationContext zurückgegeben wird.
Hinweis |
|---|
| Eine Ausnahme könnte ausgelöst werden, wenn der Thread, der die Meldung verarbeiten sollte, nicht mehr aktiv ist. |
Weitere Informationen zu Multithread-Windows Forms-Steuerelementen finden Sie unter Gewusst wie: Verwenden eines Hintergrundthreads zur Dateisuche.
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.
Hinweis