我是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();
}
}
}
答案 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