【问题标题】:WCF threading - non-responsive UIWCF 线程 - 非响应式 UI
【发布时间】:2010-06-01 11:53:28
【问题描述】:

我正在尝试配置一些 WCF 内容。目前,我有一个允许远程用户下载文件的服务器和客户端。 在服务器中,我使用了一个 ServiceHost 类。我认为它应该在单独的线程上运行,但是,当有人下载​​文件时,服务器 UI(WinForms)会被锁定。有没有办法管理 WCF 线程模型?

谢谢!

【问题讨论】:

  • 您如何托管服务?它是使用某些 exe 的窗口服务还是自定义托管?
  • WinForms 可执行文件承载 WCF 服务库。

标签: .net wcf multithreading user-interface servicehost


【解决方案1】:

您应该将ServiceBehaviorAtttribute 添加到实现您的服务的类中,并将其UseSynchronizationContext 属性设置为false。这将导致对您的服务的调用在它们自己的线程上进行处理。

例子:

[ServiceBehavior(UseSynchronizationContext=false)]
class YourService : IYourService
{
  // Service Methods
}

请记住,如果您要从服务方法中更新任何控件,则必须牢记cross-thread programming model of Windows Forms。

【讨论】:

  • 哇 + 1 不知道这个功能!
  • 这是我的 ~2 天错误搜索的解决方案,为什么 WCF 服务在非 UI 应用程序上不起作用(应用程序同时具有 UI 和非 UI 模式)。谢谢。
【解决方案2】:

“从同一个 Windows 窗体应用程序中,如果您在启动 UI 线程之前构造 ServiceHost 实例,它将在自己的线程上运行。这意味着从线程池分配的工作线程处理消息而不是消息循环。因此,服务可以真正处理多个并发请求。”

【讨论】:

  • 这将产生与我在下面给出的答案相同的功能。由于您是在 SycnhronizationContext.Current 属性设置为 WindowsFormsSynchronizationContext 实例之前创建 ServiceHost(例如,在创建任何控件之前),因此您的 ServiceHost 不会尝试在 UI 线程上处理服务请求。我的解决方案的优势在于它使这种行为成为政策问题,因此您决定在什么时候创建 ServiceHost 并不重要。
【解决方案3】:

您不应在 UI 程序中托管 WCF 服务。 WCF 有一个非常具体的线程模型,它会阻止你的 UI 运行良好。

基本上,WCF 线程方案会根据所选的实例管理行为而改变,并且当在一段时间内没有请求到达服务时,WCF 可能会暂停正在运行的线程。所有这些都会给 UI 带来麻烦。

在这种情况下,我要做的是创建一个Windows Service hosting WCF,并创建一个 ServiceContract 来将所需的数据公开给监控 UI。这个 UI 将在它自己的 exe 中独立运行,作为服务的另一个客户端,根据需要从服务中获取数据。

我希望对你有意义。

【讨论】:

    猜你喜欢
    • 2012-04-20
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多