在开发WPF应用程序时,我曾尝试以非交互方式停止该应用程序的执行。此应用程序用于用户将作业提交到Windows集群的环境中,有时他们会在意外情况下提交UI代码。这些实例最终在服务器上运行,直到有人发现它们的存在并终止进程。
遵循多问题解答(#1,#2,#3)中的建议,我使用Environment.UserInteractive
实现了以下代码,以停止非交互式使用:
private void Application_Startup (object sender, StartupEventArgs e)
{
if (Environment.UserInteractive)
{
var window = new MainWindow();
window.Show();
}
}
使用Windows7任务计划程序进行的快速测试显示,该进程仍处于活动状态!因为任务被设置为无论用户是否登录都要运行,所以我在任何地方都看不到窗口,并且不确定Environment.UserInteractive
是否返回true
。
那么,如何检测WPF应用程序是否是非交互运行的呢?
发布于 2013-03-21 23:26:25
显然,这个建议是正确的,Environment.UserInteractive
返回了false
。然而,最终发生的是WPF调度程序继续运行,而不管窗口是否存在。当您阅读Application.ShutdownMode
的备注时,这一点会变得很明显
只有在调用
的
Shutdown
方法时,Application
应用程序才会停止运行。关机可以隐式发生,也可以显式发生,具体由ShutdownMode
属性的值指定。
为了真正停止WPF进程的非交互运行,您必须告诉它停止运行!
if (Environment.UserInteractive)
{
var window = new MainWindow();
window.Show();
}
else
{
// This step is important, otherwise the application will continue running
this.Shutdown(1);
}
一旦您添加了对Application.Shutdown
的调用,该进程将在非交互运行时以一种很好的方式分解!
任务计划程序已成功完成任务"\RunTest“,实例"{0d4e6506-b12b-4181-8a75-17754ddef81c}”,操作"\networkshare\path\to\Executable.exe“,返回代码为%1。
https://stackoverflow.com/questions/15551630
复制相似问题