【问题标题】:Multi-threaded self-hosting WCF service多线程自承载 WCF 服务
【发布时间】:2012-06-08 07:52:53
【问题描述】:

看起来 WCF 在使用自托管时只使用一个线程。我想为此使用多个线程或某种线程池。是否可以使用自托管配置,或者我需要为此使用 IIS?

【问题讨论】:

  • 是什么让你认为它只使用一个线程?您对实例模式的设置是什么?
  • 我在调试器中观察到了。我不知道实例模式。我该如何改变它?我不使用 WCF 配置应用程序和 App.config 文件顺便说一句。
  • 调试器不是真实的。而且你可能也没有很好的测试。
  • 请记住,调试器在暂停时会默认阻塞所有线程,因此传入的请求将不会被处理。
  • 我已经尝试过使用一个具有 5 个并行线程的客户端,然后使用两个客户端。此外,我尝试延迟服务方法的返回,我可以看到下一个请求直到第一个请求完成后才被提供。

标签: .net wcf


【解决方案1】:

如果您使用默认服务行为设置在 UI 应用程序中自行托管服务,您可能会看到您所描述的行为。默认服务行为使用同步上下文。如果在 UI 线程(WinForms、WPF)中启动服务主机,所有请求都将路由到公共 Windows 消息循环 => 所有请求都由 UI 线程按顺序处理。

在任何其他情况下(包括为 UI 线程中托管的服务手动设置 [ServiceBehavior(UseSynchronizationContext = false)]),服务主机为每个请求从线程池调度新线程。基于实例上下文模式和并发模式还有一些进一步的差异,但使用默认设置您会看到我描述的行为。

【讨论】:

  • 太棒了!那行得通。谢谢你。但您可能的意思是 UseSynchronizationContext = false。
  • 同样依赖于客户端实现,每个方法调用都需要ServiceFactory.CreateChannel
【解决方案2】:
[ServiceBehavior(UseSynchronizationContext = false)]

解决了我的问题。阅读此评论后,在服务和命令行应用程序中对此进行了测试,没有遇到相同的并发问题。所以我很乐意确认这只是在 UI 线程上实例化时的问题。

我认为吸取的教训是为您的 WCF 测试工具使用命令行应用程序。

【讨论】:

    【解决方案3】:

    我自托管一切 - 保证它不是单线程的。上面的评论者可能是在正确的轨道上 - 确保如果您在服务 impl 上的 ServiceBehavior 属性设置为 InstanceContextMode.Single,那么您也设置了 ConcurrencyMode.Multiple,否则您只会看到一个线程。如果您没有 ServiceBehavior 属性,则默认值会在每次调用时为您提供一个服务 impl 实例(InstanceContextMode.PerCall、ConcurrencyMode.Single)。也可能与连接限制有关,但如果您在配置中进行了设置,您可能会知道。

    【讨论】:

      猜你喜欢
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多