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";
}
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
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. –