Laden...

[Event]VisibleChanged - zu häufig gefeuert O.o

Erstellt von Frokuss vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.229 Views
F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 6 Jahren
[Event]VisibleChanged - zu häufig gefeuert O.o

Wunderschönen guten Tag,

ich habe heute ein merkwürdiges Verhalten bei diesem Event festgestellt, was vermutlich wegen mir sich so "doof" verhält... Und zwar wird meiner Ansicht nach das Event viel zu häufig gefeuert...

So wie ich das sehe, ist mit dem Anzeigen des Fensters das erste mal das Event gefeuert. Daher wurde Visible von false auf true geändert. So weit so gut...

Bei mir das Event aber insgesamt vier mal gefeuert - wobei ich **einmal **(von true auf false) den Status ändere. Hier einmal ein wenig Code:


public Program(){
	//Hier werden noch ein paar Panels erzeugt...
	t1 = new Verbindung(pw);//Eine Socket-Verbindung wird erstellt:

	this.VisibleChanged += new EventHandler(CheckAutoLogin);
	while(!t1.autoTry)//Automatischer Login versuch - keine Aussage auf Erfolg!
		Thread.Sleep(125);//Verhindert das Anzeigen des Fensters
}

private void CheckAutoLogin(object sender, EventArgs evt){
	MessageBox.Show(Visible.ToString());//nur zum testen

	if(t1.auth && Visible){
		login = t1.auth;
		LoginOk();
	}
}

private void LoginOk(){
	//this.Visible = false;//Siehe folgendem Text
	//if(myIcon == null)//unschöne Lösung
		myIcon = new TrayIcon();
}

Wenn ich den Code wie zu sehen ausführe, geht alles soweit - nur dass das Fenster noch angezeigt ist. Wenn ich aber in der Methode LoginOk den Visible Status ändere, wird das Event viermal gefeuert. Und zwar wie folgt:
1.) Initialisieren mit Anzeigen: Visible := true
2.) Durch mich Visible := false
3.) Warum auch immer Visible := true
4.) Wieder zurück Visible := false
Das ganze hat dann zur Folge, dass mein TrayIcon zwei mal angeugt wird. Also nicht so cool ist. Durch das If-Statement kann ich dies aber verhindern.

Leider habe ich nur keine Ahnung, warum das Event so häufig gefeuert wird. Würde mich freuen, wenn jemand mir da weiterhelfen könnte.

Besten Gruß Frokuss

2.298 Beiträge seit 2010
vor 6 Jahren

Häng dich doch mal mit dem Debugger dran und schau dir die Aufrufliste an.

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

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

F
Frokuss Themenstarter:in
158 Beiträge seit 2015
vor 6 Jahren

So. Habe das mal gemacht... Also meine Klasse Programm wird nur einmal aufgerufen, und zwar von:
private static void Main(string[] args) Somit ist das schon mal als Fehlerquelle auszuschließen.

Meine Event-Methode gibt aber genau vier Aufrufe wieder. Was also genau zwei mal den Status true/false entspricht. Über sender.ToString() erhalte ich dann folgendes:> Fehlermeldung:

ClientForm.Program, Text: Ich habe soweit alles unnötige auskommentiert und kann mir das deswegen nicht erklären...
Dabei sind:
ClientForm: Projektmappe
Program: Klasse/Konstruktor
Text:: Der Titel/Text aus dem Form (bei mir keiner...)

Somit bin ich nun genau so schlau wie vorher... Warum auch immer wird das Event zu häufig gefeuert...

Gruß Frokuss

5.658 Beiträge seit 2006
vor 6 Jahren

Hi Frokuss,

was du suchst, ist das Fenster "Aufrufliste" bzw. "Call Stack".

Du brauchst keinen Code zu schreiben, um den Aufrufer einer Methode herauszufinden. Dafür gibt es den Debugger.

Weeks of programming can save you hours of planning