Windows窗体关闭时停止线程

本文关键字:线程 窗体 Windows | 更新日期: 2023-09-27 18:28:56

我是C#的新手,遇到了一个问题。我有一个Form,它运行一个从串行端口接收输入的线程。然而,当窗口关闭时,线程会继续运行。我尝试重写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();
        }
    }
}

Windows窗体关闭时停止线程

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

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

OnClosed或OnClosed事件调用尝试查看任何正在运行的子线程并全部中止。。。在您的代码中,首先调用port.close,然后运行线程,您已经可以在Oncl 中访问该线程