我编写了一个连接到服务器的类,一旦连接成功就引发一个事件但是当事件被引发时,程序就会死掉并返回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";
}
答案 0 :(得分:3)
看起来您的事件处理程序正在尝试从其他线程修改UI。你不能那样做 - 这意味着新线程中会抛出异常,这反过来会杀死进程。
我希望这会打破调试器,除非你改变了异常设置。
修复方法是使用Control.BeginInvoke
中的Dispatcher.BeginInvoke
或Session_OnConnectionChange
。