【问题标题】:Detecting end of background processes in C# / .NET?在 C#/.NET 中检测后台进程的结束?
【发布时间】:2010-08-06 15:27:28
【问题描述】:

我有一个用 C# 编写的进程,它没有任何形式或输出。

static void Main() {
    MyBackgroundProcess process = new MyBackgroundProcess();
    // begin background process
    process.Start(); 
    // keep application running in the background, run events
    Application.Run();
}

我需要在应用程序终止时释放一些资源并做其他事情(这应该只在运行它的用户注销或通过任务管理器手动终止时;该进程永远不会自行终止)。

处理这个问题的最佳方法是什么?

我尝试过但没有奏效的方法:

  • 将事件挂钩到 Application.ApplicationExit 和 Application.ThreadExit
  • 让 MyBackgroundProcess 实现 IDisposable 并将 Main 逻辑包装在 using() 中

【问题讨论】:

    标签: .net


    【解决方案1】:

    【讨论】:

    • 我最终使用了其中的一种“解决方法”(使用监视过程定期检查,在我的情况下,它已经存在)。具有讽刺意味的是,我想做的主要清理功能之一就是告诉监控服务该进程不再运行。谢谢!
    【解决方案2】:

    如果MyBackgroundProcess 继承System.Diagnostics.Process,那么有些事件对你有用。

    您可以利用进程对象的Exited 事件在进程终止时执行一个方法。查看文档了解详细信息:

    http://msdn.microsoft.com/en-us/library/system.diagnostics.process.exited.aspx

    【讨论】:

      【解决方案3】:

      你根本无法让它可靠。 Taskmgr 在没有追索权的情况下向你开枪。更明显的故障模式是某种令人讨厌的 CLR 问题,例如 ExecutionEngineException。还有一些简单的事情,比如有人被电源线绊倒。

      通过在 Application.Run() 调用之后在正常关闭时设置一个持久标志来解决此问题,该标志指示“数据已知良好”。总是在启动时检查上一次运行是否有问题(缺少标志),以便清理弹片。

      【讨论】:

        【解决方案4】:

        您可以使用各种元进程,即引入第三个进程,该进程同时运行主进程和后台进程,然后在主进程终止时终止后台进程。

        一些伪代码:

        static void Main()
        {
          MyBackgroundProcess backgroundProcess = new MyBackgroundProcess();                
          backgroundProcess.Start(); 
        
          MyMainProcess mainProcess = new MyMainProcess();
          mainProcess.Start();
        
          mainProcess.WaitForExit();
          backgroundProcess.Kill();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-02
          • 1970-01-01
          • 2014-05-23
          • 2012-01-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多