0

WPFアプリケーションの開発中に、非対話型の方法でアプリケーションの実行を停止しようとしました。このアプリケーションは、ユーザーがWindowsクラスターにジョブを送信する環境で使用され、誤ってUIコードを送信することがあります。これらのインスタンスは、誰かが自分の存在を認識してプロセスを強制終了するまで、サーバー上で実行されることになります。

複数の質問(#1#2#3Environment.UserInteractive )の回答からのアドバイスに従って、非対話型の使用を停止するために使用して次のコードを実装しました。

private void Application_Startup (object sender, StartupEventArgs e)
{
    if (Environment.UserInteractive)
    {
        var window = new MainWindow();
        window.Show();
    }
}

Windows 7タスクスケジューラを使用した簡単なテストでは、プロセスがアクティブなままであることがわかりました。ユーザーがログインしているかどうかに関係なくタスクが実行されるように設定されているため、ウィンドウがどこにも表示されず、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 に答える