如何处理两个进程之间的进程间通信?
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
。
也就是说,
A
在B
启动后立即死亡。
B
下载然后应用 msi
B
启动 A
并退出。无论下载是否完成,都会发生这种情况
【讨论】:
以上是关于如何处理两个进程之间的进程间通信?的主要内容,如果未能解决你的问题,请参考以下文章