启动线程,做工作,关闭应用程序,继续在其他线程的后台工作

时间:2014-07-24 15:42:24

标签: c# .net winforms

我正在努力满足用户的一些需求,其中一个需要证明有点困难。我无法创建Windows服务来执行此操作,因此我不确定如何执行此操作。

基本上,他们在他们完成后继续关闭程序。但是应用程序清楚地表明操作仍在进行中,并且必须等待它们关闭窗口。这项操作不需要ETA,因为他们坚持在应用程序有机会完成他们的工作之前关闭应用程序,我想到了什么。

如何关闭某个应用( this.Hide() - 但是this.Dispose(true))但是启动了一个在应用关闭时运行操作的外部线程?

4 个答案:

答案 0 :(得分:2)

许多应用程序“关闭托盘”,即只是隐藏,没有什么不寻常的。我建议你的客户这是一种常见的方法, if 你想让应用程序保持运行。创建一个新的(隐藏的)进程来做这件事只是做同样的事情,只是更容易出错,更难以正确地进行监控。

此外,如果您的客户决定在后台作业仍处于活动状态时再次启动您的应用,那么在后台运行“隐藏”过程可能会导致问题。但如果应用程序有工作要做,我不明白为什么你不能阻止关闭它。这是最好的方法,因为您可以确保只运行一个实例并能够正确监控其进度。

如果他们强行关闭它(例如使用任务管理器),那么你无能为力。

答案 1 :(得分:1)

问题是,一旦你关闭应用程序,你也处理它的所有子项,你需要做this.hide()然后在你的工作完成后调用application.exit(),或者创建一个新的顶级应用程序启动主UI应用程序并处理后台工作。

答案 2 :(得分:1)

您可以订阅FormClosing事件并取消关闭应用的尝试,直到该过程完成并且您已准备好允许它为止。

private bool isProcessRunning;

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = isProcessRunning;
}

在启动主题之前将isProcessRunning设置为True;你完成后将其设置为False

我还考虑显示流程仍在运行的指示器(如ProgressBar),因此他们不会坐在那里试图关闭应用程序,认为它是根本没有反应。

当然,如果这个过程非常重要,您可能需要更强大的解决方案。无法阻止用户关闭他们的机器,这也会导致您的进程终止。

答案 3 :(得分:0)

在我提出解决方案之前,请允许我说我不认为你应该这样做。相反,隐藏窗口,或最小化到托盘,或类似的东西。我认为这是用户的期望。许多应用程序最小化并继续工作,然后在完成后退出。如果应用程序看起来已退出但仍在运行,则用户可能会重新启动或再次启动应用程序。

如果您确实想要这样做,请:

1)在另一个线程中完成工作。在线程完成之前,EXE不会退出。例如:

private void Form1_Load(object sender, EventArgs e)
{
   new Thread(DoWork).Start();
} 
private void DoWork()
{
   Thread.Sleep(10000);
   MessageBox.Show("done!");
}

2)或者在表单退出后进行工作。通过修改Program.cs来执行此操作:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());

    MessageBox.Show("Still running!  Can still do work here!");
}