2012-03-23 116 views
1

我是C#的新手,遇到问题。我有一个表单,它运行一个接收来自串口的输入的线程。但是,当窗口关闭时,线程继续运行。我试图覆盖virtual void OnClosing(object sender, CancelEventArgs e),但MessageBox保持弹出状态,这意味着线程仍在运行。我究竟做错了什么?哪个是最好的生命周期方法来覆盖窗口关闭前进行清理?Windows Form OnClosing停止线程

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

“这似乎不起作用”......为什么不呢?怎么了?你在调试器中看到什么? – SLaks 2012-03-23 00:53:51

+0

调试器中没有任何内容。 MessageBoxes保持弹出状态,这意味着线程仍在运行 – 2012-03-23 00:54:36

+0

它可能是积压的消息吗?如果你删除MessageBox并观看控制台呢? – 2012-03-23 01:03:43

回答

3

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

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

OnClosing或OnClosed事件呼叫尝试,看看任何一个孩子线程运行并中止他们... ...在你的代码第一次调用port.close然后runThread,你已经在Oncl上访问它