2008-09-04 96 views
0

我有两个不相关的进程使用.NET程序集作为插件。但是,任何一个进程都可以随时启动/停止。我不能依赖作为服务器的特定进程。实际上,可能有多个副本运行其中一个进程,但只有其中一个运行。没有服务中介的.NET IPC

我最初实施了基于this article的解决方案。但是,这需要实施服务器的客户端在客户端之前运行。

当客户端首次运行时,实现某种通知到服务器的最佳方式是什么?

回答

1

使用共享内存更加困难,因为您必须管理共享内存缓冲区(或只是预先分配足够的)。您还必须手动管理您在其中放置的数据结构。一旦你对它进行了测试和工作,由于它的简单性,它将更容易使用和测试。

如果您使用远程路由,则可以使用IpcChannel而不是TCP或HTTP通道进行使用命名管道的单个系统通信。 http://msdn.microsoft.com/en-us/library/4b3scst2.aspx。这个解决方案的问题是你需要想出一个注册表类型的解决方案(无论是在共享内存还是其他持久性存储),这些进程可以注册他们的端点。这样,当您在寻找它们时,您可以找到一种方法来查询系统上运行的所有端点,并且可以找到您要查找的内容。使用Remoting的好处在于序列化和方法调用都非常简单。另外,如果您决定转移到网络上的多台计算机,则可以将交换机改为使用网络通道。缺点是Remoting可能会感到沮丧,除非你清楚地将“远程”呼叫与“本地”呼叫区分开来。

我对WCF了解不多,但也值得关注。蜘蛛的感觉说,它可能有一个更优雅的解决这个问题......也许。

或者,您可以创建一个与所有其他进程分开并启动的“服务器”进程(使用系统Mutex确保多个进程未启动)充当中介和所有其他流程的注册中心。

还有一件事要考虑事件的发布 - 订阅模型(Pub/Sub)。当您有一个在事件源可用之前启动的侦听器时,此技术会有所帮助,但您不想等待注册该事件。 “服务器”进程将处理事件注册表以连接发布者和订阅者。

0

为什么不在双方都托管服务器和客户端,谁先来到谁就成为服务器?如果服务器退出,那么仍处于活动状态的客户端将切换角色。

0

处理IPC(.net或不)的方法很多,通过TCP/HTTP隧道是一种方法......但可能是一个非常糟糕的选择(取决于环境和环境)。

共享内存和命名管道是两种方式(是的,他们可以在.Net中完成),这可能是更好的解决方案。在.Net框架中也有IPC类...但由于某些AppDomain问题,我个人不喜欢它们...

0

我同意加罗。

使用pub/sub服务将是一个很好的解决方案。这显然意味着,这项服务需要在另外两个之前启动并运行。

如果您想跳过发布/订阅,您可以在两个具有不同端点的应用程序中实施该服务。当任一应用程序启动时,它会尝试通过IPC代理访问另一个已知对象。如果代理失败,另一个对象没有启动。

斯科特

0

我了2天通过所有可用的IPC选项蜿蜒而寻找一个可靠,简单和快速的方式做全双工的IPC。我在Codeplex.com上发现的IPCLibrary,迄今为止完全没有尝试过的所有选项。全部只有7行代码。 :D如果有人在试图找到一个全双工IPC时遇到了这个问题,那么可以省下很多时间,然后试试这个库。获取源代码,编译data.dll并按照给出的示例进行操作。

HTH, Circ