首页 > 解决方案 > 如何让进程干净地关闭

问题描述

我有一个进程,我希望能够从外部进程干净地关闭。也就是说,我想给它一个机会在它死之前清理它的资源(保存它的数据等)。

Process.CloseMainWindow似乎是普通的方法,除了有问题的进程没有任何窗口,我不想立即调用Process.Kill,因为我想给它机会先清理(并且不能杀死进程命令被目标进程拦截)。

那么让我的进程与另一个进程完全关闭的最佳方法是什么?

我可以控制这两个过程。要关闭的进程确实有一个消息循环 ( Application.Run()),所以我认为我可以通过那里发布一些消息。

我已经阅读了关于终止进程的 msdn 文章关于干净地关闭进程的文章,但是尽管我试图实现的目标很简单,但两者都提到了看起来相当复杂的方法。鉴于我可以控制这两个进程,我希望有一些更简单的东西可以在 C# 中干净利落地实现。有吗?

关闭的进程不是服务,所以不能做服务停止。

标签: c#winapi

解决方案


我不确定.NET 消息循环是否支持线程消息,或者仅支持窗口消息。如果它支持线程消息,则终止应用程序可以使用PostThreadMessage()WM_QUIT消息(或消息循环可以查找的自定义消息)发布到目标进程的主线程,以便它可以停止其消息循环并退出应用程序。

否则,让目标应用程序创建一个命名的内核事件对象EventWaitHandle,然后通过调用EventWaitHandle.WaitOne()手动线程或调用ThreadPool.RegisterWaitForSingleObject()以使用系统提供的线程池来等待该事件。当事件发出信号时,您可以通知主线程退出应用程序。然后,终止应用程序可以使用 名称打开事件对象EventWaitHandle.OpenExisting(),然后使用 发出事件信号EventWaitHandle.Set()


推荐阅读