如何允许进程完全关闭

时间:2018-08-09 01:53:10

标签: c# winapi

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

Process.CloseMainWindow似乎是普通的处理方式,除了所讨论的进程没有任何窗口,并且我不想立即调用Process.Kill因为我想给它机会首先清理(并且kill进程命令不能被目标进程拦截)。<​​/ p>

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

我对这两个过程都有控制权。要关闭的进程确实有一个消息循环(Application.Run()),所以我认为可能会有一些消息可以在此发布。

我已经阅读了msdn article on terminating processesthis article about closing processes cleanly,但是尽管我尝试实现的方法很简单,但它们都提到了相当复杂的方法。鉴于我对这两个过程都有控制权,所以我希望可以在C#中完全实现一些简单的操作。有一个吗?

关闭过程不是服务,因此无法停止服务。

1 个答案:

答案 0 :(得分:0)

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

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