2
サーバーに接続し、接続が成功したときにイベントを発生させるクラスを作成しましたが、イベントが発生すると、プログラムは終了し、デバッグメッセージなしでIDEに戻ります。ちょうど私が自分でプログラムを閉じたかのように。C#イベントがエラーなしでプログラムを終了する
イベントの開催をコメントしても、これは起こりません。
注:以前はカスタムイベントを使用したことがないので、私は非常にばかげたミスを犯した可能性がありますが、デバッガがなければ私は迷っています。あなたのイベントハンドラは、別のスレッドからUIを変更しようとしているように見えます
//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";
}
そうです、それは正しいと思われますが、私はそれがスレッドの問題であると感じていましたが、私はデバッガの不足によってちょっと困惑しました。 – Steve
私は、これらの問題のいくつかは、関連するコントロールで 'CheckForIllegalCrossThreadCalls = false'を設定することによって解決できる(つまり、ハッキングされる)と考えています。 **しないでください**あなたを守るためにそこにあります。私はこれが実際に何をしているのか詳しく見ていない。 –