启动线程,做工作,关闭app,继续在其他线程后台做工作

本文关键字:工作 线程 其他 后台 关闭 启动 app 继续 | 更新日期: 2023-09-27 18:14:53

我正在努力满足我的用户的一些需求,其中一个被证明有点困难。我不能创建一个Windows服务来做到这一点,所以我不确定如何做到这一点。

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

我如何关闭一个应用程序(不是 this.Hide() -但this.Dispose(true)),但启动一个外部线程,运行一个操作,而应用程序已关闭?

启动线程,做工作,关闭app,继续在其他线程后台做工作

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

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

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

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

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

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

启动线程前设置isProcessRunningTrue;完成后设置为False

我还会考虑显示进程仍在运行的指示器(如ProgressBar),这样他们就不会坐在那里试图关闭应用程序,认为它只是没有响应。

当然,如果过程真的很重要,您可能需要一个更健壮的解决方案。不能阻止用户关闭他们的机器,这也会杀死你的进程。

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

如果你真的想这样做,要么:

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!");
}