当我的应用程序失败时,我如何通知Windows任务计划程序?
本文关键字:通知 Windows 任务 程序 计划 何通知 失败 应用程序 我的 | 更新日期: 2023-09-27 18:17:20
我在任务调度程序中安排了一个WPF应用程序。
我想在应用程序失败时通知任务调度程序。
在任务调度程序窗口中,在Run Result
列的Task Status
部分,我总是得到Success
,即使应用程序抛出内部异常。
我使用Application.Current.Shutdown(1)
试图通知任务调度程序失败,但我没有成功。
如何做到这一点?
问题出在Task Scheduler的设计上。正如这里指出的:
Win7中的Windows任务调度程序如何识别失败的任务?
我已经在测试中验证过了
Windows任务调度程序不检查退出代码或任何其他任务完成时的值。您必须处理任何错误处理在自己的脚本或程序中。
如果您查看计划任务的历史记录,您应该看到两个事件,一个是Action Completed,然后是task Completed。如果检查Action Completed,它看起来应该是这样的:
如您所见,应用程序使用返回代码退出,但Task Scheduler仍然显示成功。我看到的唯一解决方案是通过右键单击历史条目并选择"将任务附加到此事件…"来自己处理此问题。任务调度程序成功完成任务"'test4",实例"{a41adae0-a378-45f6-aadc-648d27852042}",动作"C:'blah..blah'Release'WpfApplication1.exe"返回代码55.
或者,您可以从批处理文件运行应用程序,并让批处理文件检查退出代码,并采取相应的行动。然后,您可以使用任务调度程序来调度批处理文件,而不是直接调度WPF应用程序。
关于从WPF应用程序返回退出代码,您可能需要右键单击Visual Studio中的项目属性,并在应用程序选项卡中选择输出类型的控制台应用程序。此外,在Task Scheduler中使用发布构建而不是调试构建,以确保使用了应用程序的退出代码,而不是从添加的调试内容中生成的代码。你可以测试你的应用程序是否正确地生成一个退出代码,通过使这个小批处理文件在你的exe文件的同一文件夹中运行它(替换你的应用程序的exe文件名):
wpfapplication1.exe
echo %errorlevel%
pause
您的原始代码可能会成功设置退出代码,但Shutdown是一种更温和的退出,可能不会立即退出(或根本不会退出),因为它将等待线程等优雅地退出。环境。
使用环境。退出时,您应该指定退出代码,而不是默认值0(表示成功)。可以使用
Environment.Exit(someNumber)
环境。退出
您需要一个全局异常处理程序来处理未被捕获的异常。这篇博文提供了更多的细节:http://jrich523.wordpress.com/tag/task-scheduler/
适用于:
抛出新的异常
而不是操作成功完成。(0x0),它会显示类似(0xE0434362)