在表单运行线程时关闭主应用程序

时间:2014-09-01 06:15:50

标签: c# multithreading forms user-interface task

我有一个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);当我尝试时,它没有任何障碍。 所以现在我有另一个问题,这就是为什么会发生这种情况?

我尝试注册ClosingClosedFormClosing事件并设置m_stopped = true,但他们没有被调用。

编辑: 由于@drf建议线程是前台线程,因此应用程序在运行时被阻止,因此添加:

worker.IsBackground = true;

修好了。

2 个答案:

答案 0 :(得分:0)

我认为关闭申请时,您应该使用Application.Exit Method

  

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

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

答案 1 :(得分:0)

您的线程当前是一个前台线程,它将阻止进程退出,直到线程完成。 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();
}