使用 IPC 中断正在运行的进程

Posted

技术标签:

【中文标题】使用 IPC 中断正在运行的进程【英文标题】:Interrupt a running process with IPC 【发布时间】:2019-08-18 20:17:33 【问题描述】:

我在 Win Form 应用程序中有两个进程。在第一个过程中,我有一个方法“checkIfTrue”,它的返回值为布尔值。第一个进程中的方法将通过 IPC 从第二个进程获取一些信息(我将 WCF 与命名管道一起使用)并将返回,取决于来自第二个进程的信息是真还是假。

我的问题如何中断第一个进程?第一个进程中的方法向第二个进程询问信息,当第二个进程得到信息时,将结果返回给第一个进程。在第一个过程中,在方法“checkIfTrue”完成之前不会处理结果。

第二个进程将通过 IPC 调用方法“synchronizeResults”并传输结果。 “synchronizeResults”方法将结果存储在 ConcurrentDictionary 中。我的计划是在第一个过程中停止方法“checkIfTrue”,直到字典被填满。但是在方法“checkIfTrue”完成之前,IPC不会调用方法“synchronizeResults”。

通常我会在从进程 2 发回结果时触发一个事件,但在这种情况下,我需要在方法完成之前得到结果。

【问题讨论】:

嗯,这取决于。您的两个处理程序在什么情况下运行?它们是服务还是控制台应用程序。桌面应用程序、网络应用程序,还是其他?两个进程之间存在什么样的网络基础设施?您计划使用哪种 IPC(RESTful、WCF、更接近网络的东西)?通常,您要“中断”的进程需要侦听 中断。当 IPC 消息到达时,侦听代码关闭并执行某些操作(可能在单独的线程上),然后做出适当的响应。这种舞蹈应该如何发生取决于您的限制 这是一个 Win-Form 应用程序,对于 IPC,我使用带有命名管道的 WCF。 我会试试 AutoResetEvent。 这里涉及到两个过程。如果侦听器是 WinForms 应用程序,则在您的启动代码中(例如表单的构造函数或 InitializeComponent 的末尾)启动 WCF 主机,并指示它进行侦听。当消息到达时,只需Form.Invoke 有人在表单上调用。它不会“中断”处理,但会在您的应用下一次深入表单的消息循环时导致调用运行(这对您来说应该足够好了)。 我用 AutoResetEvent 解决了它。第一个过程要求提供信息。那时我调用 autoResetEvent.WaitOne()。得到结果后,我调用 autoResetEvent.Set()。 【参考方案1】:

它不起作用的主要原因是我的 CallbackService-Class。我忘了用

标记课程
[CallbackBehavior(UseSynchronizationContext = false, ConcurrencyMode = ConcurrencyMode.Multiple)].

当从服务向客户端进行回调时,只会产生一个线程,因为默认情况下并发模式设置为“单一”。

这是[链接] (https://blogs.msdn.microsoft.com/dsnotes/2013/09/18/wcf-callback-operations-are-invoked-sequentially/)

【讨论】:

以上是关于使用 IPC 中断正在运行的进程的主要内容,如果未能解决你的问题,请参考以下文章

35 守护进程 互斥锁 IPC 共享内存 的方式 生产者消费者模型

第一个进程保持运行而后续进程仅通过参数的最佳 IPC 方法是啥?

安卓IPC机制之Binder详解

复习:IPC机制

Linux - 使用第二个进程建立 IPC 的选项

事件驱动的进程间通信 (IPC)