[英]Closing main app while form is running a thread
我有一个C#Windows应用程序,在其中创建某个类的实例,在该类中,它具有一个成员,该成员是窗口表单,并且此表单具有一个按钮,当我单击它时,我将打开一个可以运行工作线程的新表单,可以说:
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;
修复。
我认为要关闭应用程序,您应该使用Application.Exit Method
:
它通知所有消息泵它们必须终止,然后在处理完消息后关闭所有应用程序窗口。
您也可以跟踪每个表单的FormClosing
事件。 检查Thread.IsAlive
然后Thread.Abort()
或取消关闭。
您的线程当前是前台线程,它将阻止进程退出直到线程完成。 http://msdn.microsoft.com/zh-CN/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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.