C#事件杀死程序没有错误

时间:2010-12-08 08:37:43

标签: c# multithreading events

我编写了一个连接到服务器的类,一旦连接成功就引发一个事件但是当事件被引发时,程序就会死掉并返回IDE而没有调试消息就像我关闭了自己编程。

如果我评论事件的提出,这不会发生。

注意:我之前从未使用过自定义事件,所以我可能犯了一个非常愚蠢的错误,但没有调试器,我就迷失了。

以下是相关代码:

//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";
        }

1 个答案:

答案 0 :(得分:3)

看起来您的事件处理程序正在尝试从其他线程修改UI。你不能那样做 - 这意味着新线程中会抛出异常,这反过来会杀死进程。

我希望这会打破调试器,除非你改变了异常设置。

修复方法是使用Control.BeginInvoke中的Dispatcher.BeginInvokeSession_OnConnectionChange