Windows Form OnClosing Остановка потока - PullRequest
1 голос
/ 23 марта 2012

Я новичок в C #, и у меня возникла проблема.У меня есть форма, которая запускает поток, который получает вход от последовательного порта.Однако, когда окно закрыто, поток продолжает работать.Я попытался переопределить virtual void OnClosing(object sender, CancelEventArgs e), но MessageBox продолжает появляться, что означает, что поток все еще работает.Что я делаю неправильно?Какой метод жизненного цикла лучше всего переопределить для очистки перед закрытием окна?

DisplayForm.cs

using System;
using System.ComponentModel;
using System.Drawing;
using System.IO.Ports;
using System.Threading;
using System.Windows.Forms;

namespace project
{
    public partial class DisplayForm : Form
    {
        private Thread readThread;
        private SerialPort port;
        private bool running;

        public DisplayForm(String portName)
        {
            InitializeComponent();


            port = new SerialPort(portName);
            port.Open();

            readThread = new Thread(Read);
            running = true;
            readThread.Start();
        }

        public void Read()
        {
            while (running)
            {
                try
                {
                    string message = port.ReadLine();
                    Console.Write(message);
                    MessageBox.Show(message);
                }
                catch (TimeoutException)
                {

                }
            }
        }

        protected virtual void OnClosing(object sender, CancelEventArgs e)
        {
            running = false;
            readThread.Join();
            port.Close();
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Вам нужно использовать Abort(), а не Join().

protected virtual void OnClosing(object sender, CancelEventArgs e) 
{ 
    running = false; 
    readThread.Abort();
    port.Close(); 
} 
0 голосов
/ 23 марта 2012

При вызове события OnClosing или OnClosed попытайтесь увидеть работающий дочерний поток и прервать их все ... в своем коде сначала вызовите port.close, а затем запустите Thread, к которому у вас уже есть доступ в Oncl

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