【问题标题】:How do I notify Windows Task Scheduler when my application fails?当我的应用程序失败时如何通知 Windows 任务计划程序?
【发布时间】:2013-06-02 21:34:18
【问题描述】:

我在任务计划程序中安排了一个 WPF 应用程序。

我想在应用程序失败时通知任务计划程序。

在任务计划程序窗口中,在Run Result 列的Task Status 部分中,我总是得到Success,即使应用程序引发了内部异常。

我使用Application.Current.Shutdown(1) 尝试向任务计划程序通知失败,但没有成功。

如何做到这一点?

【问题讨论】:

标签: c# wpf scheduled-tasks


【解决方案1】:

问题在于任务计划程序的设计。正如这里指出的:

How does Windows Task Scheduler in Win7 recognize a failed task?

我已经在测试中验证过

Windows 任务计划程序不检查退出代码或任何其他 任务完成时的值。您必须处理任何错误处理 在您自己的脚本或程序中。

如果您查看计划任务的历史记录,您应该会看到两个事件,以及已完成的操作,然后是已完成的任务。如果您检查 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

您的原始代码可能会成功设置退出代码,但 Shutdown 是一个更温和的退出,并且可能不会立即(或根本)退出,因为它会等待线程等优雅退出。 Environment.Exit 将更加有力地退出。

要使用 Environment.Exit,您应该指定一个退出代码,而不是默认值 0(这意味着成功)。您可以使用

Environment.Exit(someNumber)

Environment.Exit

您需要有一个全局异常处理程序来处理其他未捕获的异常。这篇博文提供了更多细节:http://jrich523.wordpress.com/tag/task-scheduler/

【讨论】:

  • @AlexandrePerez - 抱歉我最初的回答不完整。查看我最近的编辑。
  • 我不明白为什么Windows任务计划程序不尊重正在运行的程序的返回值!
  • 这个答案不清楚——解决方案是在编辑的一半。感谢您的努力;多么令人沮丧的问题!
【解决方案2】:

适用于:

抛出新异常

而不是操作成功完成。 (0x0),它会显示类似 (0xE0434362)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-18
    • 2013-07-28
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    相关资源
    最近更新 更多