Windows窗体OnClosing停止线程

时间:2012-03-23 00:51:46

标签: c# .net winforms

我是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 个答案:

答案 0 :(得分:3)

您需要使用Abort()而不是Join()

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

答案 1 :(得分:0)

OnClosing或OnClosed事件调用尝试查看正在运行的所有子线程并将其全部中止...在您的代码中首先调用port.close然后运行您已在Oncl中访问它的runThread

相关问题