Как я могу уведомить планировщик задач Windows, когда мое приложение завершилось с ошибкой?

У меня есть приложение WPF, запланированное в Планировщике задач.

Я хочу уведомить Планировщика заданий, когда приложение не работает.

В окне "Планировщик заданий" в разделе Task Status в столбце Run Result я всегда получаю Success, даже если приложение выдает внутреннее исключение.

Я использовал Application.Current.Shutdown(1) при попытке оповестить о неудаче планировщика заданий, но я не был успешным.

Как это можно сделать?

Ответ 1

Вы должны указать код выхода, отличный от значения по умолчанию 0 (что означает успех). Вы можете сделать это, используя

Environment.Exit(someNumber)

Environment.Exit

Для этого вам понадобится глобальный обработчик исключений для других исключенных исключений. Это сообщение в блоге дает более подробную информацию: http://jrich523.wordpress.com/tag/task-scheduler/

ИЗМЕНИТЬ

Я сделал предположение, что проблема была в вашем приложении. Вы знаете, что они говорят о допущениях. Проблема, оказывается, в разработке планировщика заданий. Как указано здесь:

Как диспетчер задач Windows в Win7 распознает неудачную задачу?

который я проверил при тестировании

Планировщик задач Windows не проверяет код выхода или любой другой значения, когда ваша задача завершается. Вы должны обрабатывать любую обработку ошибок в вашей собственной script или программе.

Если вы заглянете в историю своей запланированной задачи, вы должны увидеть два события и действие завершено, а затем выполнить задание. Если вы изучите действие Выполнено, оно должно выглядеть примерно так:

Планировщик заданий успешно завершил задачу "\ test4", экземпляр "{a41adae0-a378-45f6-aadc-648d27852042}", действие "C:\blah..blah\Release\WpfApplication1.exe" с кодом возврата 55.

Как вы можете видеть, приложение вышло с кодом возврата, но Task Scheduler все еще говорит об успехе. Единственное решение, которое я вижу, - это справиться с этим, щелкнув правой кнопкой мыши по записи истории и выбрав "Прикрепить задачу к этому событию...".

Или вы можете запустить приложение из пакетного файла и попросить пакетный файл проверить код выхода и действовать соответствующим образом. Затем вы использовали планировщик заданий для планирования пакетного файла вместо планирования вашего приложения WPF напрямую.

Что касается возврата кода выхода из вашего приложения WPF, вам может потребоваться щелкнуть правой кнопкой мыши по свойствам проекта в Visual Studio, а на вкладке "Приложения" выбрать "Консольное приложение для типа вывода". Кроме того, используйте сборку релиза в планировщике задач, а не сборку отладки, чтобы убедиться, что используется код выхода из приложения, а не что-то генерируемое из добавленного материала отладки. Вы можете проверить, правильно ли создается ваше приложение для кода выхода, сделав этот небольшой пакетный файл в той же папке, что и ваш exe файл, и запустив его (заменив имя файла exe вашего приложения):

wpfapplication1.exe
echo %errorlevel%
pause

Ваш исходный код может успешно установить код выхода, но Shutdown - более мягкий выход и может не выходить немедленно (или вообще), так как он будет ждать потоков и т.д., чтобы выйти изящно. Environment.Exit выйдет более решительно.