6

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

谢谢!

4

3 回答 3

11

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

例子:

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

请记住,如果要从服务方法中更新任何控件,则必须牢记Windows 窗体的跨线程编程模型

于 2010-06-03T00:37:54.393 回答
1

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

于 2010-06-01T12:51:08.363 回答
0

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

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

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

我希望对你有意义。

于 2010-06-01T12:08:50.113 回答