【问题标题】:.NET processes in Task Scheduler任务计划程序中的 .NET 进程
【发布时间】:2010-12-29 16:55:11
【问题描述】:

我有一个程序执行另一个程序,当该程序完成后主程序继续运行。

Process p = Process.Start("program2.exe");

while (!p.HasExited)
    Thread.Sleep(10000);

if (p.HasExited)
{
    // Execute more code
}

这在我运行程序时效果很好。但在windows中用作计划任务时不起作用。这部分永远不会执行

if (p.HasExited)
{
    // Execute more code
}

似乎找不到调试方法。 我已经被这个程序卡住了一个星期了。

【问题讨论】:

  • 你确定 Process p = Process.Start("program2.exe");甚至一开始就被执行?
  • 我同意,p 可能永远不会真正启动,因此它会立即转到 HasExited。你可以检查它的退出代码,看看是否有问题。
  • 顺便说一句,C# 编程语言没有进程。 .NET 可以。

标签: c# .net process scheduled-tasks


【解决方案1】:

如果您假设一旦 p.HasExited 为真,它就会保持这种状态,您的代码会更简单。然后,您可以删除 if 语句。那么只有三种方式我可以看到你的代码可以给出你看到的结果:

  1. 第二个进程永远不会退出。你能在任务管理器中看到吗?
  2. 您的代码引发异常。您是否在某处记录异常?
  3. 第二个进程退出,但从不报告 HasExited。

你能试着先调查并消除1和2吗?最好先看看简单的替代方案。

更新:来自 cmets 的 Andrew Keith 还建议代码可能根本没有被执行。随意插入日志语句,这样您就可以准确地看到正在发生的事情。例如记录到一个文件。

【讨论】:

  • 如何插入日志功能?在哪里?我是 C# 新手,谢谢
  • 如果您想将日志记录集成到您的项目中,您可以查看log4net。如果你想要更轻量级的东西,你可以使用System.Diagnostics.Trace
【解决方案2】:

我的猜测是与运行计划任务的用户有关的安全问题。即:该程序可以像您一样正常工作,但是作为计划任务用户,它不允许执行“program.exe”(或者更糟糕的是,您的程序)。

您可以查看任务调度程序日志(在任务调度程序控制面板 -> 高级菜单中)。它应该为您的任务提供一个退出代码为零(或者可能是一)。如果你得到一个非常大的退出代码,那就是不对的。

哦,Process.WaitForExit() 可能比您的轮询循环更干净。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 2011-05-29
    • 1970-01-01
    • 2012-10-23
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多