2010-06-01 76 views
6

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

谢谢!

+0

你是如何托管这项服务的?这是一个窗口服务或使用一些exe的自定义托管? – Kangkan 2010-06-01 12:01:21

+0

WinForms可执行文件托管WCF服务库。 – SharpAffair 2010-06-01 12:06:57

回答

1

“如果要在启动UI线程之前构建ServiceHost实例,它将在其自己的线程上运行,即从线程池分配的工作线程处理消息而不是消息循环。因此,服务可以真正处理多个并发请求。“

+1

这将导致功能等同于我在下面给出的答案。由于您在SycnhronizationContext.Current属性设置为WindowsFormsSynchronizationContext的实例(例如,在创建任何控件之前)之前创建ServiceHost,因此您的ServiceHost不会尝试在UI线程上处理服务请求。我的解决方案的优点是它使这个行为成为一个策略问题,所以在决定创建ServiceHost的哪一点上都没有关系。 – luksan 2010-06-04 00:20:12

0

您不应在UI程序中托管WCF服务。 WCF有一个非常特定的线程模型,这将阻止你的用户界面运行良好。

基本上,WCF线程方案根据所选的实例管理行为而变化,并且当在一段时间内没有请求到达服务时,WCF可能会暂停正在运行的线程。所有这些都会导致用户界面出现问题。

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

我希望对你有意义。

11

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

例子:

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

只要记住,如果你打算从你的服务方法内更新任何控制,你必须记住cross-thread programming model of Windows Forms承担。

+0

WOW + 1不知道那个功能! – 2010-06-03 07:55:26

+0

这是为什么WCF服务无法在非UI应用上工作(应用同时具有UI和非UI模式)的2天错误搜索解决方案。谢谢。 – 2016-01-11 17:23:36