当窗体运行线程时关闭主应用程序

问题描述:

我有一个C#窗口应用程序,我在其中创建了某个类的实例,其中有一个窗口窗体的成员,此窗体有一个按钮,当我单击但我打开一个可以运行工作线程的新形式,比方说:当窗体运行线程时关闭主应用程序

public static void Main() 
{ 
    MyClass mc = new MyClass(); 
    mc.ShowForm(); 
} 

在MyClass.cs:

public void ShowForm() 
{ 
    MyFirstForm firstForm = new MyFirstForm(); 
    firstForm.Show(); 
} 
在MyFirstForm.cs

private void myButton_Click(object sender, EventArgs e) 
{ 
    MySecondForm secondForm = new MySecondForm(); 
    secondForm.Show(); 
} 

在MySecondForm.cs:

private void startButton_Click(object sender, EventArgs e) 
{ 
    var worker = new Thread(StartWork); 
    worker.Start(); 
} 

private void stopButton_Click(object sender, EventArgs e) 
{ 
    m_stopped = true; 
} 

private void StartWork() 
{ 
    while(!m_stopped) 
    { 
     //work... 
    } 
} 

当我运行我的应用程序,点击myButton的,然后单击startButton,然后退出我的应用程序(我有一个托盘图标点击退出时,调用base.Shutdown() ),第二种形式保持悬挂和不响应。

我原来的问题是,什么是通知第二种形式,它应该关闭和停止正在运行的线程的最佳方式,但在写这篇文章时,我注意到我可以使用Task.Factory.StartNew(StartWork);,当我尝试它时,它没有工作一个顺利。 所以现在我有另一个问题,这是为什么会发生这种情况?

我试过注册到Closing,Closed,FormClosing事件和设置m_stopped = true但他们没有被调用。

编辑: 作为@drf建议的线程是一个前台线程因此该应用被阻挡在它运行时,因此添加:

worker.IsBackground = true; 

固定它。

+0

设置其母公司 - '.Show(本)',所有的子窗体应该得到与他们的父母 – Sayse 2014-09-01 06:18:20

+0

关闭你可以跟踪'形式Closing'事件关闭正在运行的线程。 – Hassan 2014-09-01 06:22:21

+0

会将线程上的['IsBackground'](http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground(v = vs.110).aspx)属性设置为true work ? – drf 2014-09-01 06:28:24

您的线程当前是前台线程,它将阻止进程退出,直到线程结束。 http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground(v=vs.110).aspx

更改线程启动代码这样:

private void startButton_Click(object sender, EventArgs e) 
{ 
    var worker = new Thread(StartWork); 
    worker.IsBackground = true; 
    worker.Start(); 
} 
+0

感谢@drf已经说过 – ZivS 2014-09-02 13:01:25

+0

太好了。你试过了吗?如果您愿意,请更新您的帖子中的代码以显示它?否则,那些一直在使用.NET线程的人会立即得出我有的结论。 – jaket 2014-09-02 15:18:52

我觉得收盘应用程序,你应该使用Application.Exit Method

它通知所有消息泵必须终止,然后关闭该消息后,所有应用程序窗口已被处理。

你也可以跟踪每个表格的FormClosing事件。检查Thread.IsAlive然后Thread.Abort()或取消关闭。

+0

不,绝对不是,Application.Exit错过了重要的关闭步骤。 – Sayse 2014-09-01 06:40:48

+0

@Sayse。你的意思是关闭个人表格? – Hassan 2014-09-01 06:43:47

+0

[“Exit方法不会引发Closed和Closing事件..”](http://msdn.microsoft.com/zh-cn/library/ms157894(v = vs.110).aspx),我是肯定还有更多它 – Sayse 2014-09-01 06:46:00