Laden...

Control.Invoke läuft ins Leere

Letzter Beitrag vor 13 Jahren 7 Posts 1.433 Views
Control.Invoke läuft ins Leere

Hallo Community,

folgender Code in einer Form:


public void InitialShow() {
	this.SafeHandleCreation(); //Create Handle for Invoke
	if(this.InvokeRequired) {
		this.Invoke(new MethodInvoker(InitialShow), new object[] { });
		return;
	}
	this.Show();
}

private void ClientControl_OnConnectionEstablished(object sender, Connection c) {
	this.SafeHandleCreation();
	this.Invoke(new MessageHandler(AddMessage), new object[] { c, "Connection established." });
}
		
private void AddMessage(object sender, string message) {
	txtMessageLog.AppendText(DateTime.Now.ToShortTimeString() + " " + message + " ("+ ((Connection)sender).ID +")" + ".\r\n");
}

und folgendes Problem, wenn ich nach Programmstart die Funktion InitialShow() aufrufe, wird alles problemlos ausgeführt. Wenn jedoch bevor die Form angezeigt wird, das Event OnConnectionEstablished ausgelöst wird, kommt es zunächst auch noch zu keinem Fehler.
Wenn ich aber dann versuche, die Funktion InitialShow() aufzurufen, spingt der Debugger zu InvokeRequired und this.Invoke, allerdings passiert danach nichts mehr...
Keine Exception, kein garnichts.

Was ist hier passiert? Irgendwelche Ideen / Anregungen?

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

Prüf mal ob this.Handle einen sinnvollen Wert enthält... ansonsten mit this.CreateHandle() Erstellung des Handles forcieren.

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

Sorry, hate ich vergessen zu schreiben:


private void SafeHandleCreation() {
	if(!this.IsHandleCreated) {
		this.CreateHandle();
	}
}

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

Hi,

rufst du InitialShow() denn aus einem anderen Thread aus auf?
Wenn ja dann muß auch das CreateHandle im GUI-Thread laufen (also im Invoke-Aufruf), und wenn nein, dann ist das Invcke ja generell überflüssig.

Außerdem muß für ein Invoke natürlich der (Haupt-)GUI-Thread schon laufen (d.h. Application.Run(...) aufgerufen worden sein).

Gut zu wissen, aber das wuerde ja bedeuten, dass ich CreateHandle() direct nach dem Konstruktor ausrufen muss, denn ich kann spaeter nicht mehr im GUI-Threat ein Handle erstellen, weil ich das Handle brauche, um den Invoke zu machen. Da beiszt sich der Hund in den Schwanz ^^

Zur Zeit des Invokes laeft Application.Run() selbstredent. Ist es denn ausreichend, CreateHandle() nach dem Konstruktor aber vor Application.Run() aufzurufen oder fuehrt das zu weiteren Problemen?

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

Was soll das bringen?

Das Handle einer Form ist er gültig wenn sie angezeigt wurde, wenn du kein Run ausführst wird keine Form erzeigt.

Erzähle mal, warum du meinst soetwas machen zu müssen.

Hallo Lost-Ha(n)f-PHP,

Gut zu wissen, aber das wuerde ja bedeuten, dass ich CreateHandle() direct nach dem Konstruktor ausrufen muss, denn ich kann spaeter nicht mehr im GUI-Threat ein Handle erstellen, weil ich das Handle brauche, um den Invoke zu machen. Da beiszt sich der Hund in den Schwanz ^^

ganz pauschal heißt das Thema Synchronisation. Du musst dafür sorgen, dass der Handle existiert, bevor zu Control.Invoke benutzt. Dazu gibt es viele Wege. Ganz generell macht es ja nur dann Sinn, ein Form zu aktualisieren, wenn es - und sein Handle - schon existieren. Die einfachte Möglichkeit, ist den Thread erst zu starten, nachdem das der Fall ist.

herbivore