用于进程间通信的 wcf 服务

Posted

技术标签:

【中文标题】用于进程间通信的 wcf 服务【英文标题】:wcf services for interprocess communication 【发布时间】:2012-06-20 21:44:25 【问题描述】:

我已经组装了一个 .net winform 应用程序,它使用由另一个作为 Windows 服务运行的 .net 应用程序公开的 wcf 服务。

由于通信是在同一台机器内,所以我选择了NetNamedPipe作为通信通道,因为它最适合在同一台机器内进行进程间通信。

我想知道在 .net windows 服务中定义 wcf 服务时是否使用了正确的属性选择。

WCF 服务行为定义为:

[ServiceBehavior( 
    ConcurrencyMode = ConcurrencyMode.Single,
    InstanceContextMode = InstanceContextMode.Single)]

我将“InstanceContextMode”选择为 Single,以便我知道每次 UI 客户端调用 wcf 服务方法时都不会重新创建 wcf 服务中的对象。

但是,在阅读 MSDN 上要选择的 ConcurrencyMode 属性时,我确实有点困惑。在基本层面上,我了解 ConcurrencyMode 属性决定 wcf 服务是否支持单个、多个或可重入调用。

这是否意味着,如果我的 UI 客户端应用程序是多线程的,并且我从这些线程调用 wcf 服务方法,我应该选择“并发”模式为“多”,如果我的 UI 客户端不是多线程的,我应该选择“并发”模式为“单”?我的 UI 客户端应用程序没有运行多个线程。所有操作都通过事件处理程序在主 UI 线程上执行(通过按钮单击、组合框选择等...)

我遇到的情况是,在 Windows 测试机器上安装应用程序后,我的 UI 客户端有时无法连接到 wcf 服务。它只是一直等待对 wcf 客户端对象的 Connect 方法的调用,然后最终超时。我想知道它是否与我所做的“并发模式”选择有关。还是这是“NetNamedPipe”通信渠道问题?

请指教。

提前致谢。

分部

【问题讨论】:

【参考方案1】:

仅当您的主机对象是线程安全的,即您已手动实现对共享资源的锁定或您的主机对象根本没有任何共享或类级别对象时,才选择多重并发模式。如果宿主对象不是线程安全的,请使用单一的并发模式,在这种情况下,wcf 将自动为您实现锁定,在上下文中一次只处理一个请求,并行将排队。所以这里的决定应该取决于你的宿主对象是否是线程安全的。

【讨论】:

以上是关于用于进程间通信的 wcf 服务的主要内容,如果未能解决你的问题,请参考以下文章

C# .net 3.5 进程间通信验证子进程是不是启动正常

WCF实现进程间管道通信Demo

Web 和窗口应用程序的进程间通信

.NET 进程间通信的最佳选择是啥? [关闭]

.NET 进程间通信的最佳选择是啥? [关闭]

IPC 进程间通信