使用 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 共享内存 的方式 生产者消费者模型