使用序列化在c#中的2个进程/应用程序之间进行通信(进程间通信)

时间:2011-08-05 06:53:20

标签: c#

最近我在面试中被问及以下内容:

有一个进程/应用程序A每隔5分钟(假设)不断获取消息

要求是有一个进程/应用程序B需要从A传输消息。

但是,流程/应用程序A应该确保消息实际上已经收到了流程/应用程序B.

面试官想知道如何在c#中实现这一点。我们可以在这里使用序列化吗?

从我的理解,可以做到的最好方法是使用Message Queue或PIPE Mechanism。

3 个答案:

答案 0 :(得分:0)

在.NET中有一些可能的IPC方法:

  1. .NET 4中的内存映射文件
  2. .NET Remoting
  3. 使用套接字和环回(127.0.0.1)
  4. 最简单的是在.NET 4.0中使用内存映射文件 您可以使用序列化或任何消息表示格式,例如用于消息传递的XML 这是关于IPC的,但如果您想确保从(进程B或其他进程)发送请求的位置,您必须使用签名机制。

答案 1 :(得分:0)

任何涉及在进程之间发送消息的东西(或者,通常,甚至在单个进程中的AppDomains之间)使用某种类型的序列化,因为最终数据需要映射到某个可以遍历进程空间,根据定义,“消息”是序列化数据。这个序列化可以是显式的或隐式的(自动的,可能是代理/存根层 - 虽然我不喜欢)。

实际上,流程/应用程序A 无法 “确保”已经交付,因为它无法强制执行第二个流程。但是,它可能会有某种回调确认消息。事务性消息队列不是不合理的,但这只能确保它排队 - 它不能确保它被处理(永远)。就个人而言,我先看看套接字是否足够。

答案 2 :(得分:0)

序列化(简而言之)是创建消息的过程。但是,如果您有兴趣确保消息到达目的地(并且处于一致状态),那么您应该询问通信协议 - 这就是描述消息实际发送方式的内容。例如,UDP协议不保证传送和TCP确实。

还值得一提的是,保证交付意味着保证系统B接收完整的消息,或者系统A将被告知交付失败(例如系统B关闭时)。也就是说,一些消息队列也保证了传递 - 当队列中的按摩没有到达目的地时,消息将被标记为失败(例如将其置于失败的消息队列中)。