C# 在父进程退出后使子进程保持活动状态

C# 在父进程退出后使子进程保持活动状态,c#,C#,我正在为windows服务编写自动更新程序。这就是我希望它工作的方式(如果有更好的解决方案,请告诉我) 我被困在#2上,因为当我停止父服务时,子进程的进程被终止。如何在C语言中启动一个新进程?它不是子进程,只是自身存在?您可以使用process.Start启动一个单独的独立进程: 例如: 您可以使用调度程序服务。尽管其他人认为这可以直接做到 确保“计划”服务(也称为“任务计划程序”)正在运行 运行或命令行实用程序来计划子进程的执行 等待停止事件到达服务,如果您在超时时间内没有收到它,则表明您有问

我正在为windows服务编写自动更新程序。这就是我希望它工作的方式(如果有更好的解决方案,请告诉我)


我被困在#2上,因为当我停止父服务时,子进程的进程被终止。如何在C语言中启动一个新进程?它不是子进程,只是自身存在?

您可以使用
process.Start
启动一个单独的独立进程:

例如:


您可以使用调度程序服务。尽管其他人认为这可以直接做到

  • 确保“计划”服务(也称为“任务计划程序”)正在运行
  • 运行或命令行实用程序来计划子进程的执行
  • 等待停止事件到达服务,如果您在超时时间内没有收到它,则表明您有问题;)根据计划的方式,您可以尝试再次运行它
  • 我更喜欢schtasks命令,类似于以下命令:

    C:\>schtasks.exe/create/tn“My Updater”/sc once/ru System/sd 01/01/1999/st 00:00/tr“C:\Windows\System32\cmd.exe/C dir C:>C:\temp\ran.txt”

    这将产生以下输出:

    警告:任务可能无法运行,因为/ST早于当前时间。

    成功:已成功创建计划任务“我的更新程序”。

    请小心,如果该名称的任务已存在,将生成覆盖提示。创建任务后,您可以随时运行该任务:

    C:\>schtasks.exe/run/tn“我的更新程序”

    成功:尝试运行计划任务“我的更新程序”。

    最后,您可以删除该任务,但需要确认:

    C:\>schtasks.exe/delete/tn“我的更新程序”

    警告:是否确实要删除任务“我的更新程序”(Y/N)?y

    成功:已成功删除计划任务“我的更新程序”。

    因此,要使用这些命令,您只需要生成您选择的调度程序。当然,这也可以通过编程实现;然而,我从来没有弄清楚到底是怎么回事;)


    由于同时使用了std::out/err和std::in,我强烈建议阅读这篇关于如何使用的文章。另外,我建议您使用一个好的进程,这样您就不会在等待进程退出时陷入死锁。

    这与运行不同:进程p=新进程();p、 开始()??我的理解是,这种方式会创建一个子进程。我不确定它是否会在随后被停止的服务中工作。是的,它们是不同的。以这种方式启动它类似于从“运行”对话框启动某些内容。它与其父级不关联。如果您前往MSDN,他们会详细解释重载之间的区别。@csharptest.net:如果服务以这种方式启动子项,则在服务停止时不会杀死子项。这两者在启动时没有关联。@Mrchief:它们没有区别,但它不会创建子进程。谢谢您的帮助。我不喜欢这个想法,简单的事实是,通过使用任务调度器,我可以在处理重要事务的过程中杀死服务。
    1) The service launches a child Process (the updater).
    2) The child stops the parent service (I'm using sc.exe).
    3) The child applies the updated .exe and .dll files for the parent.
    4) The child starts the parent service.
    
    System.Diagnostics.Process.Start(@"C:\windows\system32\notepad.exe");