2010-12-08 4 views
2

Ich habe eine Klasse geschrieben, die mit einem Server verbindet und ein Ereignis auslöst, sobald die Verbindung erfolgreich ist, aber wenn das Ereignis ausgelöst wird, stirbt das Programm und geht zurück zur IDE ohne Debug-Meldung als hätte ich das Programm selbst beendet.C# Event killt Programm ohne Fehler

Wenn ich die Anhebung des Ereignisses kommentieren, geschieht dies nicht.

HINWEIS: Ich habe noch nie zuvor benutzerdefinierte Ereignisse verwendet, daher ist es möglich, dass ich einen sehr dummen Fehler gemacht habe, aber ohne den Debugger bin ich verloren.

Hier ist der entsprechende Code:

//In class 

//defining the event 
public event EventHandler OnConnectionChange; 

//raising the event 
private void OnConnect(IAsyncResult ar) 
     { 

      swSender = new StreamWriter(tcpClient.GetStream()); 
      srReceiver = new StreamReader(tcpClient.GetStream()); 
      Resp = srReceiver.ReadLine(); 
      if (Resp.Contains("OK")) swSender.WriteLine("USER {0}", User); 
      else return; 
      swSender.Flush(); 
      Resp = srReceiver.ReadLine(); 
      if (Resp.Contains("OK")) swSender.WriteLine("PASS {0}", Password); 
      else return; 
      swSender.Flush(); 
      Resp = srReceiver.ReadLine(); 
      if (Resp.Contains("OK")) 
      { 
       Connected = true; 
       if (OnConnectionChange != null) OnConnectionChange(this, EventArgs.Empty); 
       thrMessaging = new Thread(new ThreadStart(ReceiveMessages)); 
       thrMessaging.SetApartmentState(ApartmentState.STA); 
       thrMessaging.Start(); 
      } 

     } 

//in calling class 

     private void button4_Click(object sender, RoutedEventArgs e) 
     { 
      Globals.Session.OnConnectionChange += new EventHandler(Session_OnConnectionChange); 
      Globals.Session.User = txtUser.Text; 
      Globals.Session.Password = txtPass.Text; 
      Globals.Session.Login(); 

     } 

     void Session_OnConnectionChange(object sender, EventArgs e) 
     { 
      if (Globals.Session.Connected) lblConn.Content = "Connected"; 
      else lblConn.Content = "Not Connected"; 
     } 

Antwort

3

Es sieht aus wie Ihre Event-Handler versucht, die Benutzeroberfläche von einem anderen Thread zu ändern. Sie können das nicht tun - was bedeutet, dass innerhalb des neuen Threads eine Ausnahme ausgelöst wird, die wiederum den Prozess zunichte macht.

Ich würde erwarten, dass dies in den Debugger zu brechen, wenn Sie die Ausnahmeeinstellungen geändert haben.

Die Lösung wäre Control.BeginInvoke oder Dispatcher.BeginInvoke von Session_OnConnectionChange zu verwenden.

+0

Ja, das scheint richtig zu sein, ich hatte das Gefühl, dass es ein Threading-Problem wäre, aber ich war etwas perplex wegen des Fehlens des Debuggers. – Steve

+2

Nebenbei bemerkt, ich glaube, dass einige dieser Arten von Problemen "gelöst" (dh gehackt) werden können, indem "CheckForIllegalCrossThreadCalls = false" auf dem entsprechenden Steuerelement gesetzt wird. ** Nicht. ** Es ist da, um dich zu beschützen. Ich habe jedoch nicht im Detail untersucht, was das eigentlich tut. –