C#流程之间的沟通

C#流程之间的沟通,c#,servicebus,C#,Servicebus,我正在使用一个应用程序,我能够制作C#脚本在这个环境中运行。我可以将任何类型的DLL导入此环境。我的问题是我想启用这些脚本之间的通信。由于环境是受控的,并且我无法访问应用程序的源代码,因此我不知道如何做到这一点 我尝试过的事情: 文件I/O:只需在.txt文件中写入我希望每个人读取的消息,然后让其他人读取。问题是我需要这个脚本运行得很快,这占用了太多的时间 当前位置我尝试过这个,但我就是无法让它在我正在处理的环境中工作。我不是说这件事做不到,只是说我做不到 有人知道这样做的简单方法吗?也很快

我正在使用一个应用程序,我能够制作C#脚本在这个环境中运行。我可以将任何类型的DLL导入此环境。我的问题是我想启用这些脚本之间的通信。由于环境是受控的,并且我无法访问应用程序的源代码,因此我不知道如何做到这一点

我尝试过的事情:

  • 文件I/O:只需在.txt文件中写入我希望每个人读取的消息,然后让其他人读取。问题是我需要这个脚本运行得很快,这占用了太多的时间

  • 当前位置我尝试过这个,但我就是无法让它在我正在处理的环境中工作。我不是说这件事做不到,只是说我做不到


有人知道这样做的简单方法吗?也很快?

您可以使用一种进程间通信形式,即使在同一进程内。将脚本视为单独的进程,并以这种方式进行通信

在这种情况下,命名管道可能是一个不错的选择。它们速度非常快,在.NET3.5中使用起来相当容易


或者,如果脚本加载到单个AppDomain中,则可以使用静态类或单例作为通信服务。但是,如果单独加载脚本,这可能是不可能的。

好吧,由于不了解您环境的详细信息,我无法提供多少。您使用的术语是“C#scripts”……我不太清楚这是什么意思,因为C#通常是一种编译语言


如果您使用的是普通的C#,您是否研究过带有命名管道的WCF?如果程序集在同一台物理计算机上运行,则应该能够轻松快速地创建一些使用命名管道绑定托管的WCF服务。命名管道在本地上下文中提供了一种简单、高效、快速的消息传输机制。WCF本身非常易于使用,并且是.NET framework的本机组件。

您可以使用。它们比磁盘IO快,因为它们是使用主内存完成的。

进程间通信的方法应该取决于处理每条消息的重要性

例如,如果流程A告诉流程B,比如说,向您的IT员工发送一封电子邮件,说服务器已关闭,这一点非常重要

但是,如果您正在流式传输音频,则单个消息(数据包)对应用程序的性能并不重要,可以删除


如果是前者,则应该考虑使用持久存储(如数据库)来存储消息,并让每个进程轮询数据库检索其自身的消息。这样,如果一个进程被终止或暂时失去与其他进程的通信,当它再次启动时,它将能够检索到它丢失的任何消息。

由于您已经准备好了文件I/O,您可以通过将其放在RAM磁盘上获得足够的速度。如果您今天正在轮询更改,a可能有助于使您的通信更具响应性。

另一种简单的方法是打开预定义端口上的TCP套接字,从另一个进程连接到它,并以这种方式进行通信。

答案很简单


由于您可以将任何DLL导入脚本,您可以创建一个自定义DLL,该DLL将以您希望的任何方式实现进程之间的通信:共享内存、命名管道、TCP/UDP。

C#是一种创建程序而不是脚本的语言。这些答案中有很多都非常好,其中大多数我以前都尝试过实现。最后,我可以做一些我真的认为我做不到的事情,那就是简单地创建一个类,将我所有的通信代码放在其中,并将该类包含在其他两种策略中。并不是因为你的回答提供了非常丰富的信息,而是因为它让我意识到我把情况复杂化了。谢谢你,谢谢大卫,你提出了一些我没有想到的事情,我本该做的。最终,它真的帮助我认识到什么样的解决方案对我来说是最好的。