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();
}
}
}
您需要使用Abort()
而不是Join()
。
protected virtual void OnClosing(object sender, CancelEventArgs e)
{
running = false;
readThread.Abort();
port.Close();
}
OnClosed或OnClosed事件调用尝试查看任何正在运行的子线程并全部中止。。。在您的代码中,首先调用port.close,然后运行线程,您已经可以在Oncl 中访问该线程