Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用序列化在两个进程/应用程序之间进行通信(进程间通信)_C# - Fatal编程技术网

C# 使用序列化在两个进程/应用程序之间进行通信(进程间通信)

C# 使用序列化在两个进程/应用程序之间进行通信(进程间通信),c#,C#,最近我在一次采访中被问到以下问题: 有一个进程/应用程序a每5分钟不断收到一次消息(假设) 要求是有一个流程/应用程序B需要从a传输消息 但是进程/应用程序A应该确保该消息已被进程/应用程序B实际接收 面试官想知道如何在C#中实现这一点。我们可以在这里使用序列化吗 据我所知,最好的方法是使用消息队列或管道机制。在.NET中使用IPC有一些可能的方法: .NET4中的内存映射文件 .NET远程处理 使用插座和回路(127.0.0.1) 最简单的方法是使用.NET 4.0中的内存映射文件。 您可以使

最近我在一次采访中被问到以下问题:

有一个进程/应用程序a每5分钟不断收到一次消息(假设)

要求是有一个流程/应用程序B需要从a传输消息

但是进程/应用程序A应该确保该消息已被进程/应用程序B实际接收

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


据我所知,最好的方法是使用消息队列或管道机制。

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

  • .NET4中的内存映射文件
  • .NET远程处理
  • 使用插座和回路(127.0.0.1)
  • 最简单的方法是使用.NET 4.0中的内存映射文件。
    您可以使用序列化或任何消息表示格式(如XML)进行消息传递。

    这是关于IPC的,但如果您想确保请求从何处发送(进程B或其他进程),则必须使用签名机制

    任何涉及在进程之间(或者通常,甚至在单个进程中的AppDomains之间)发送消息的操作都必须使用某种序列化,因为最终需要将数据映射到可以遍历进程空间的对象,根据定义,“消息”是序列化的数据。这种序列化可以是显式的,也可以是隐式的(自动的,可能是由代理/存根层实现的,尽管我不希望这样)

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

    序列化(简而言之)是一个创建消息的过程。但是,如果您想确保消息到达其目的地(并在一致状态下发送),则应该询问通信协议——这是描述消息实际发送方式的内容。例如,UDP协议不保证传输,TCP保证

    还值得一提的是,保证传递意味着保证系统B完整地接收消息,或者系统A将被告知传递失败(例如,当系统B关闭时)。这就是说,一些消息队列也保证传递—存在一个超时,在该超时中,当消息传入队列未到达其目的地时,该消息将被标记为失败(例如,将其放入失败消息队列)