【问题标题】:running WCF in windows forms在 Windows 窗体中运行 WCF
【发布时间】:2010-10-24 18:07:44
【问题描述】:

我有一个程序作为客户端和服务器工作。我正在使用带有 BasicHttpBinding 的 wcf 服务,并且该程序正在控制台应用程序中运行。

当我将代码移至 Windows 窗体应用程序时,一切都停止工作。当客户端调用一个操作时,它不会返回。当调用服务器端的某些操作时,会导致调用方超时。

我解决了将客户端和服务器代码移动到专用线程的问题。
似乎负责处理窗口事件的线程(表单所有者)与实例化 ServiceHost 对象的线程不同。
谁能告诉我为什么?

谢谢

PS:我使用的是 .Net 3.5 和 Windows Vista

【问题讨论】:

  • @Zé pode colocar um trecho de código pra gente? Em que arquivo e que método você instancia o serviço?
  • Dias 要求我提供一些示例代码。 @Jader Dias:我的代码有太多与问题无关的类。您可以在 FormLoad 事件中测试创建表单和启动服务的问题。
  • @Zé Eu acho que o Zippit tem razão。 Você pode testar iniciar o serviço em uma outra thread?

标签: .net winforms wcf


【解决方案1】:

我原来的答案是关闭的。经过一番研究,这里是真正的原因和参考:

这是因为您在 UI 线程上启动了 WCF ServiceHost。

任何在 Windows 中进行过多线程 UI 编程的人都知道,如果不使用 Control.Invoke 方法同步回 UI 线程,就无法更新 UI。

默认情况下,WCF ServiceHost 处理来自线程池的自己线程上的所有请求。但是,当您在 UI 线程上启动 WCF ServiceHost 时,WCF 会检测到 UI 线程具有与之关联的 SynchronizationContext。 WCF 检测到这一点,而不是使用线程池来处理请求,而是将所有传入请求分派到 UI 线程。这背后的原因是,这意味着 WCF Server 组件代码可以安全地更新接口。

因此,即使您的 WCF 服务可能根本不与 UI 进行任何交互,WCF 也会使用这种机制,因为它是在 UI 线程上启动的。

简单的解决方法是应用 ServiceBehavior 属性并将 UseSynchronizationContext 设置为 false。或者在另一个线程上启动 ServiceHost(如您所见)。

以下是更多详细信息: http://bytes.com/topic/net/answers/750778-wcf-inproc-client-server-main-thread-client-call-hangs
http://www.softinsight.com/bnoyes/PermaLink.aspx?guid=4bea53fa-2553-4d7b-bfe2-b0f0e9d11d0a

对于最初的误导,我们深表歉意。希望这会有所帮助。

【讨论】:

  • 谢谢。只是一些注意事项:1)我的客户端正在调用一个没有返回值的服务,所以它不需要阻塞。 2)我的服务器和客户端是独立的。 (一个客户端调用并不意味着服务器调用也会发生)
  • 查看我的更新答案。我之前朝着正确的方向前进,但并不完全正确。
  • 正如我修改后的答案所示,您的服务实际上在做什么并不重要。 WCF 以阻塞方式实现 ServiceHost,因为它是在 UI 线程上启动的。因此,您的服务是否返回值并不重要。
猜你喜欢
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
相关资源
最近更新 更多