我正在努力满足用户的一些需求,其中一个需要证明有点困难。我无法创建Windows服务来执行此操作,因此我不确定如何执行此操作。
基本上,他们在他们完成后继续关闭程序。但是应用程序清楚地表明操作仍在进行中,并且必须等待它们关闭窗口。这项操作不需要ETA,因为他们坚持在应用程序有机会完成他们的工作之前关闭应用程序,我想到了什么。
如何关闭某个应用(不 this.Hide()
- 但是this.Dispose(true)
)但是启动了一个在应用关闭时运行操作的外部线程?
答案 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!");
}