开发者

C# Event kills program with no error

开发者 https://www.devze.com 2023-01-29 16:06 出处:网络
I\'ve written a class which connects to a server and raises an event once the connection is successful but when the event is raised the program just dies and goes back to the IDE with no debug message

I've written a class which connects to a server and raises an event once the connection is successful but when the event is raised the program just dies and goes back to the IDE with no debug message just as if i had closed the program myself.

If I comment the raising of the event out this doesn't happen.

NOTE: I have never used custom events before so it's possible i've made a very stupid mi开发者_如何学Pythonstake but without the debugger I'm lost.

Here's the relevant 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";
        }


It looks like your event handler is trying to modify the UI from a different thread. You can't do that - which means an exception will be thrown within the new thread, which will in turn kill the process.

I'd expect this to break into the debugger though, unless you'd changed the exception settings.

The fix would be to use Control.BeginInvoke or Dispatcher.BeginInvoke from Session_OnConnectionChange.

0

精彩评论

暂无评论...
验证码 换一张
取 消