Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows窗体正在停止线程_C#_.net_Winforms - Fatal编程技术网

C# Windows窗体正在停止线程

C# Windows窗体正在停止线程,c#,.net,winforms,C#,.net,Winforms,我是新来C#的,我遇到了一个问题。我有一个窗体,它运行一个线程,该线程从串行端口接收输入。但是,当窗口关闭时,线程将继续运行。我试图覆盖虚拟void OnClosing(objectsender,CancelEventArgs e),但消息框一直弹出,这意味着线程仍在运行。我做错了什么?在关闭窗口之前,覆盖以执行清理的最佳生命周期方法是什么 DisplayForm.cs using System; using System.ComponentModel; using System.Drawing

我是新来C#的,我遇到了一个问题。我有一个窗体,它运行一个线程,该线程从串行端口接收输入。但是,当窗口关闭时,线程将继续运行。我试图覆盖
虚拟void OnClosing(objectsender,CancelEventArgs e)
,但消息框一直弹出,这意味着线程仍在运行。我做错了什么?在关闭窗口之前,覆盖以执行清理的最佳生命周期方法是什么

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();
        }
    }
}

OnClosing或OnClosed事件调用尝试查看任何正在运行的子线程并将其全部中止…在代码的第一个调用端口中。关闭然后运行您在Oncl中已经有权访问的线程。您需要使用
abort()
而不是
Join()


“那似乎不管用”。。。为什么不呢?会发生什么?你在调试器中看到了什么?调试器中什么都没有。消息框不断弹出,这意味着线程仍在运行可能是积压的消息?如果您移除MessageBox并观看控制台,会怎么样?控制台消息也会不断发生
protected virtual void OnClosing(object sender, CancelEventArgs e) 
{ 
    running = false; 
    readThread.Abort();
    port.Close(); 
}