問題は、タスク スケジューラの設計にあります。ここで指摘したように:
Win7 の Windows タスク スケジューラは、失敗したタスクをどのように認識しますか?
テストで確認したこと
Windows タスク スケジューラは、タスクの完了時に終了コードやその他の値を調べません。独自のスクリプトまたはプログラム内でエラー処理を処理する必要があります。
スケジュールされたタスクの履歴を見ると、2 つのイベントと、Action Completed、それに続いて Task Completed が表示されます。Action Completed を調べると、次のようになります。
タスク スケジューラは、タスク "\test4"、インスタンス "{a41adae0-a378-45f6-aadc-648d27852042}"、アクション "C:\blah..blah\Release\WpfApplication1.exe" をリターン コード 55 で正常に完了しました。
ご覧のとおり、アプリケーションはリターン コードで終了しましたが、タスク スケジューラはまだ成功を示しています。私が見る唯一の解決策は、履歴エントリを右クリックして「タスクをこのイベントに添付...」を選択して、これを自分で処理することです。
または、アプリケーションをバッチ ファイルから実行し、バッチ ファイルで終了コードを調べて、それに応じて動作させることもできます。次に、WPF アプリケーションを直接スケジュールする代わりに、タスク スケジューラを使用してバッチ ファイルをスケジュールします。
WPF アプリから終了コードを返す場合、Visual Studio でプロジェクト プロパティを右クリックし、[アプリケーション] タブで、[出力の種類] に [コンソール アプリケーション] を選択する必要がある場合があります。さらに、デバッグ ビルドではなくタスク スケジューラでリリース ビルドを使用して、追加されたデバッグ要素から生成されたものではなく、アプリケーションの終了コードが使用されるようにします。この小さなバッチ ファイルを exe ファイルと同じフォルダーに作成して実行することで、アプリが終了コードを適切に生成しているかどうかをテストできます (アプリの exe ファイル名を置き換えます)。
wpfapplication1.exe
echo %errorlevel%
pause
元のコードは終了コードを正常に設定できますが、シャットダウンはより穏やかな終了であり、スレッドなどが正常に終了するのを待つため、すぐに (またはまったく) 終了しない場合があります。Environment.Exit はより強制的に終了します。
Environment.Exit を使用するには、既定値の 0 (成功を意味する) 以外の終了コードを指定する必要があります。これを使用して行うことができます
Environment.Exit(someNumber)
Environment.Exit
そうでなければキャッチされない例外に対してこれを行うには、グローバル例外ハンドラーが必要です。このブログ投稿で詳細を説明しています: http://jrich523.wordpress.com/tag/task-scheduler/