如何处理两个进程之间的进程间通信?

Posted

技术标签:

【中文标题】如何处理两个进程之间的进程间通信?【英文标题】:What to do with interprocess communication between two processes? 【发布时间】:2011-09-17 17:50:39 【问题描述】:

我需要一些有关进程间通信的帮助。

我有一个应用程序 A 和一个应用程序 B。 应用程序B的目的是更新应用程序A。由于应用程序A不能更新自己,必须有一些dll需要更新,这就是使用应用程序B的原因。 应用程序 A 启动应用程序 B,应用程序 B 关闭应用程序 A 并开始更新 A。 更新程序分为两步 1) 复制 msi 位 2) 安装钻头

如果用户在第一步中取消了应用程序 B 而应用程序 A 正在等待,是否有任何方法可以指示应用程序 A 在取消更新时继续启动应用程序 A。

实现这一目标的最佳方式是什么?如何实现?互斥锁是唯一的解决方案吗?

【问题讨论】:

mutex 肯定不是唯一的解决方案。您是否可以完全控制这两个应用程序,这两个 Windows 窗体或 WPF 应用程序是什么?如果 B 被取消,你想让 A 继续做什么?重新打开B还是忽略继续正常工作? 两者都是 WPF 应用程序。是的,我有控制权。如果 B 被取消,我希望 A 正常继续 您可以编辑您的问题并提供更多详细信息吗?比如,用户可以在 B 运行时继续使用 A 吗?为什么需要两个独立的应用程序? @David:我添加了更详细的问题描述。 【参考方案1】:

看看XDMessaging,它使用Windows Messaging 或File IO for IPC。您还可以使用全局Mutex 或Semaphore 来实现基本信令。

另外一种基本方法(如果适合的话)。以下在一个新进程中启动应用程序 B 并阻塞,直到它退出。您可以使用退出代码来控制行为。

Process appB = Process.Start("C:\\applicationb.exe");
appB.WaitForExit();
int exitCode = appB.ExitCode;

您还可以创建与某些自定义对话框并行运行的更新 MSI,并在更新之前使用自定义操作关闭其他应用程序。有多种方法可以实现这一点,从终止进程到通过 Windows 消息传递信号。

【讨论】:

我不想使用第三方库:( 当第二个应用退出时,您总是可以使用 Process 和 WaitForExit 继续,这是您想要的吗? 我想这就是我想要的。 我以为 A 启动 B,然后 A 继续运行。如果 B 被取消,B 退出并且 A 继续(不重新启动)。否则 A 退出,B 继续。仅当 B 终止 A 时,A 中的 WaitForExit 才会起作用。但 A 可能希望以受控方式关闭自己。【参考方案2】:

我不会为此使用Mutex。我会使用EventWaitHandle。详情请见Send message from one running console app to another。

【讨论】:

【参考方案3】:

我认为这不应该使用 IPC 来完成。如果用户取消下载,我认为B 应该启动A

也就是说,

    AB 启动后立即死亡。 B 下载然后应用 msi B 启动 A 并退出。无论下载是否完成,都会发生这种情况

【讨论】:

以上是关于如何处理两个进程之间的进程间通信?的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信:管道

Unix进程小结进程间通信方式总结

进程间通信

进程间的通信简单总结

Linux进程间的通信方式

Linux进程间通信