当窗体运行线程时关闭主应用程序
我有一个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;
固定它。
您的线程当前是前台线程,它将阻止进程退出,直到线程结束。 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();
}
我觉得收盘应用程序,你应该使用Application.Exit Method
:
它通知所有消息泵必须终止,然后关闭该消息后,所有应用程序窗口已被处理。
你也可以跟踪每个表格的FormClosing
事件。检查Thread.IsAlive
然后Thread.Abort()
或取消关闭。
设置其母公司 - '.Show(本)',所有的子窗体应该得到与他们的父母 – Sayse 2014-09-01 06:18:20
关闭你可以跟踪'形式Closing'事件关闭正在运行的线程。 – Hassan 2014-09-01 06:22:21
会将线程上的['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