Laden...

InvokeRequired funktioniert nicht

Erstellt von System.Diagnostics vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.290 Views
S
System.Diagnostics Themenstarter:in
3 Beiträge seit 2015
vor 8 Jahren
InvokeRequired funktioniert nicht

Ich habe vor kurzem ein Projekt -nur für ein Review- zu Ansicht bekommen von einem Distributor der insolvent gegangen ist. Einiges an diesem Code gibt mir im in der Oberfläche(WindowsForms) jedoch Rätsel auf.

Folgender Code für eine überschriebene System.Windows.Form Klasse wirft eine WrongThread Exception in Zeile 11.


1:override void OnResize()
2:{
3:    if(this.InvokeRequired)
4:    {
5:        Action method = OnResize;
6:        this.Invoke(method);
7:    }
8:    else
9:    {
10:       this.Location = new Point(0,0);
11:       base.OnResize();
12:  }
13:}

Wenn der Debugger bei der Exception(Zeile 11) anhält und ich es untersuche ist this.InvokeRequired == true. Das hätte nach meinen Verständniss nicht passieren dürfen. (Was ich im Moment im Code erkennen kann ist das ausschlieslich mit Action/Func.BeginInvoke über den ThreadPool gearbeitet wird um ansynchrone Tasks abzuschiessen. (kein async wegen .Net 4) aber das erklärt irgendwie nicht warum der Selbschutz der Methode nich greift.

(Ich bin bereits der Theorie nachgegangen das einzelne Unterelemente nicht im gleichen Thread erstellt worden sind und konnte das ausschliessen, das hätte auch nicht erklärt warum this.InvokeRequired in Zeile 11 trotzdem true ist. Diese Zeile dürfte nach meinem Verständiss sonst garnicht erreich werden.)

Ich hab null Peil wie ich diesen Fehler klassifizieren soll. Hat jemand etwas mehr Erfahrung als ich und kann sich das erklären?

W
196 Beiträge seit 2008
vor 8 Jahren

Ich kann mir kein Szenario vorstellen, bei dem dieser Code überhaupt einen Sinn ergibt. Hat die Anwendung mehrere GUI-Threads? Da scheint mir ganz grundlegend was falsch zu laufen...

2.298 Beiträge seit 2010
vor 8 Jahren

Hallo wcseller,

Der gezeigte Code gibt sehr wohl Sinn und ist bei Zugriffen auf die GUI aus anderen Threads heraus sogar erforderlich!

Hallo System.Diagnostics,

ich habe mal einen kleinen Versuchsaufbau mit dem von dir gezeigten Code gemacht. - Einen Fehler kann ich an der Stelle nicht feststellen. - Bist du sicher, dass es genau die Stelle ist, an der der Fehler auftritt?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

W
196 Beiträge seit 2008
vor 8 Jahren

Der gezeigte Code gibt sehr wohl Sinn und ist bei Zugriffen auf die GUI aus anderen Threads heraus sogar erforderlich!

Ich bezog mich mit meiner Aussage nicht auf die Verwendung von InvokeRequired und Invoke an sich, sondern vielmehr auf die Verwendung in einer überschriebenen Methode OnResize des Forms.

ICH zumindest kann mir nicht vorstellen, wozu ein Aufruf dieser Methode von ausserhalb des GUI-Threads sinnvoll sein sollte.

4.221 Beiträge seit 2005
vor 8 Jahren

Tritt das noch auf wenn This.Invokerequired um && this.Handle != Intptr.Zero ergänzt ?

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...