我有一个程序作为客户端和服务器工作。我将 wcf 服务与 BasicHttpBinding 结合使用,并且该程序在控制台应用程序中运行。
当我将代码移至 Windows 窗体应用程序时,一切都停止工作。当客户端调用一个操作时,它不会返回。当调用服务器端的某些操作时,会导致调用者超时。
我解决了将客户端和服务器代码移动到专用线程的问题。
看来负责处理窗口事件的线程(表单所有者)不能与实例化 ServiceHost 对象的线程相同。
谁能告诉我为什么?
Thanks
PS:我使用的是.Net 3.5和Windows Vista
我原来的答案已经关闭了。经过一番研究,这里是真正的原因和参考:
这是因为您在 UI 线程上启动了 WCF ServiceHost。
在 Windows 中进行过多线程 UI 编程的人都知道,如果不使用 Control.Invoke 方法之类的方法同步回 UI 线程,就无法更新 UI。
默认情况下,WCF ServiceHost 处理线程池中自己线程上的所有请求。但是,当您在 UI 线程上启动 WCF ServiceHost 时,WCF 会检测到该 UI 线程具有与之关联的 SynchronizationContext。 WCF 检测到这一点,而不是使用线程池来处理请求,而是将所有传入请求分派到 UI 线程。其背后的原因是,这意味着 WCF 服务器组件代码可以安全地更新接口。
因此,即使您的 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://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 http://www.softinsight.com/bnoyes/PermaLink.aspx?guid=4bea53fa-2553-4d7b-bfe2-b0f0e9d11d0a
对于最初的误导表示抱歉。希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)