繁体   English   中英

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

[英]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); 当我尝试它时,它运行顺利。 所以,现在我还有一个问题,为什么会这样?

我尝试注册到ClosingClosedFormClosing事件并设置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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM