2010-12-08 21 views
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"; 
     } 

答えて

3

はここに関連するコードです。これを行うことはできません。つまり、新しいスレッド内で例外がスローされ、プロセスが終了します。

例外設定を変更しない限り、私はこれがデバッガに侵入すると思います。

この修正は、Control.BeginInvokeまたはDispatcher.BeginInvokeからSession_OnConnectionChangeを使用します。

+0

そうです、それは正しいと思われますが、私はそれがスレッドの問題であると感じていましたが、私はデバッガの不足によってちょっと困惑しました。 – Steve

+2

私は、これらの問題のいくつかは、関連するコントロールで 'CheckForIllegalCrossThreadCalls = false'を設定することによって解決できる(つまり、ハッキングされる)と考えています。 **しないでください**あなたを守るためにそこにあります。私はこれが実際に何をしているのか詳しく見ていない。 –

関連する問題