【发布时间】:2014-09-01 06:15:49
【问题描述】:
我有一个 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;
修复它。
【问题讨论】:
-
设置其父表单 -
.Show(this),所有子表单都应与其父表单关闭 -
您可以跟踪
Form Closing事件并关闭正在运行的线程。 -
将线程上的
IsBackground属性设置为真正的工作吗? -
@drf - 是的,确实有效。不明白为什么
Closing没有被触发? -
@ShaZiv,您能说明您是如何注册
FormClosing活动的吗?
标签: c# multithreading forms user-interface task