0

我已经组合了一个 .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”通信渠道问题?

请指教。

提前致谢。

副部

4

1 回答 1

0

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

于 2012-06-21T07:55:18.163 回答