C # Event убивает программу без ошибок - PullRequest
2 голосов
/ 08 декабря 2010

Я написал класс, который подключается к серверу и вызывает событие после успешного подключения, но когда событие поднято, программа просто умирает и возвращается в среду 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 Ответ

3 голосов
/ 08 декабря 2010

Похоже, ваш обработчик событий пытается изменить пользовательский интерфейс из другого потока. Вы не можете этого сделать - это означает, что в новом потоке будет сгенерировано исключение, которое, в свою очередь, уничтожит процесс.

Хотя я ожидаю, что это сломается в отладчике, если только вы не изменили настройки исключения.

Исправление будет использовать Control.BeginInvoke или Dispatcher.BeginInvoke из Session_OnConnectionChange.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...