c# - 如何让进程干净地关闭
问题描述
我有一个进程,我希望能够从外部进程干净地关闭。也就是说,我想给它一个机会在它死之前清理它的资源(保存它的数据等)。
Process.CloseMainWindow
似乎是普通的方法,除了有问题的进程没有任何窗口,我不想立即调用Process.Kill
,因为我想给它机会先清理(并且不能杀死进程命令被目标进程拦截)。
那么让我的进程与另一个进程完全关闭的最佳方法是什么?
我可以控制这两个过程。要关闭的进程确实有一个消息循环 ( Application.Run()
),所以我认为我可以通过那里发布一些消息。
我已经阅读了关于终止进程的 msdn 文章和关于干净地关闭进程的文章,但是尽管我试图实现的目标很简单,但两者都提到了看起来相当复杂的方法。鉴于我可以控制这两个进程,我希望有一些更简单的东西可以在 C# 中干净利落地实现。有吗?
关闭的进程不是服务,所以不能做服务停止。
解决方案
我不确定.NET 消息循环是否支持线程消息,或者仅支持窗口消息。如果它支持线程消息,则终止应用程序可以使用PostThreadMessage()
将WM_QUIT
消息(或消息循环可以查找的自定义消息)发布到目标进程的主线程,以便它可以停止其消息循环并退出应用程序。
否则,让目标应用程序创建一个命名的内核事件对象EventWaitHandle
,然后通过调用EventWaitHandle.WaitOne()
手动线程或调用ThreadPool.RegisterWaitForSingleObject()
以使用系统提供的线程池来等待该事件。当事件发出信号时,您可以通知主线程退出应用程序。然后,终止应用程序可以使用 名称打开事件对象EventWaitHandle.OpenExisting()
,然后使用 发出事件信号EventWaitHandle.Set()
。
推荐阅读
- reactjs - 完整的解决方案
- php - 将多个字段从数据库获取到数组
- prism - 如何为 PrismLibrary 中的 IContainerRegistry 注册配置 LifeTimeManager?
- deep-learning - 目标中公式的哪些特殊变化将神经网络从梯度下降变为梯度上升?
- javascript - 使用 Angular Pipe 2 在列表中搜索列表
- xml - spark读取xml数据库记录作为xml inputStream而不是从文件路径加载
- angular - 使用 ngxBoostrap 模式的延迟加载有错误
- java - 拒绝访问 403 禁止
- php - Laravel - 如何重用在函数中传递模型作为参数的函数
- javascript - Jquery tablesorter 插件在 Django 模板中不起作用