0

在开发 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();
    }
}

使用 Windows 7 任务计划程序进行的快速测试显示该进程仍然处于活动状态!因为无论用户是否登录,任务都设置为运行,所以我在任何地方都看不到 Window 并且不确定是否Environment.UserInteractive返回true.

那么如何检测 WPF 应用程序是否以非交互方式运行呢?

4

1 回答 1

0

显然,该建议是正确的并且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。

于 2013-03-21T15:26:24.507 回答