myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: Windows-Forms » Threadübergreifender Vorgang trotz InvokeRequired
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Threadübergreifender Vorgang trotz InvokeRequired

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
myCSharp.de
Moderationshinweis von herbivore (24.03.2011 14:52):

Dies ist ein Thread, auf den aus der FAQ verwiesen wird. Bitte keine weitere Diskussion, sondern nur wichtige Ergänzungen und diese bitte knapp und präzise. Vielen Dank!
 
Programmierhans
myCSharp.de-Poweruser/ Experte

avatar-1651.gif


Dabei seit: 05.04.2005
Beiträge: 4.221
Entwicklungsumgebung: VS2003-VS2013 / SAP WebIDE
Herkunft: Zentralschweiz


Programmierhans ist offline

Threadübergreifender Vorgang trotz InvokeRequired

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Keywords: InvokeRequired ISynchronizeInvoke IsHandleCreated CreateHandle

Ausgangslage:

Wenn eine CrossThreadException auftritt (2.0) oder das UI usw. völlig unerwartet blockiert (1.1). Dann ist daran oft ein Zugriff auf UI-Controls aus einem nicht UI-Thread schuld.

Dies kann man ja relativ einfach verhindern indem man das Zielcontrol auf InvokeRequired abfragt und gegebenenfalls den Call in den UI-Thread marshallt (Suchbegriff InvokeRequired).

Es ist aber tatsächlich möglich, dass diese Situation auftritt OBWOHL man InvokeRequired abgefragt hat und dieses Property false zurückliefert.

Wie ist dies möglich, und was kann man dagegen tun ?

Hintergrund:

InvokeRequired vergleicht normalerweise den Thread des UI-Controls mit dem Thread des callers. Wenn es sich um 2 verschiedene Threads handelt, dann returniert InvokeRequired true.

Nun die Falle:

Wenn das Handle des ZielControls noch nicht erstellt ist (IsHandleCreated=false), dann kann der Vergleich noch nicht stattfinden.... InvokeRequired gibt dann false zurück (getestet in 1.1). Wenn jetzt ein direkter Call auf das UI-Control (aus einem nicht UI-Thread) stattfindet, dann entsteht dieses Problem.

Lösung:

Ein InvokeRequired ergibt nur einen sinnvollen Wert, wenn das Handle bereits erstellt ist... anderenfalls kann man z.B: mit base.CreateHandle() die Erstellung des Handles forcieren bevor man InvokeRequired abfragt.

Schlusswort:

Die wenigsten von euch werden wohl je mit diesem Problem konfrontiert... da das Timing doch relativ knapp sein muss damit man in diese Falle tappen kann. (z.B: ein Methode wird aus einem anderen Thread aufgerufen BEVOR das Control (oder Form) vollständig erstellt ist (z.B: Thread im Constructor gestartet).....

Programmierhans
02.03.2007 08:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 13 Jahre.
Der letzte Beitrag ist älter als 13 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 12.08.2020 20:44