我正在尝试配置一些 WCF 的东西。目前,我有一个允许远程用户下载文件的服务器和客户端。在服务器中,我使用了一个 ServiceHost 类。我认为它应该在单独的线程上运行,但是,当有人下载文件时,服务器 UI(WinForms)会被锁定。有没有办法管理 WCF 线程模型?
谢谢!
我正在尝试配置一些 WCF 的东西。目前,我有一个允许远程用户下载文件的服务器和客户端。在服务器中,我使用了一个 ServiceHost 类。我认为它应该在单独的线程上运行,但是,当有人下载文件时,服务器 UI(WinForms)会被锁定。有没有办法管理 WCF 线程模型?
谢谢!
您应该将ServiceBehaviorAtttribute添加到实现您的服务的类,并将其UseSynchronizationContext属性设置为 false。这将导致对您的服务的调用在它们自己的线程上进行处理。
例子:
[ServiceBehavior(UseSynchronizationContext=false)]
class YourService : IYourService
{
// Service Methods
}
请记住,如果要从服务方法中更新任何控件,则必须牢记Windows 窗体的跨线程编程模型。
“从同一个 Windows 窗体应用程序中,如果您在启动 UI 线程之前构建 ServiceHost 实例,它将在自己的线程上运行。这意味着从线程池分配的工作线程处理消息而不是消息循环。因此,服务可以真正处理多个并发请求。”
您不应该在 UI 程序中托管 WCF 服务。WCF 有一个非常具体的线程模型,它会阻止你的 UI 运行良好。
基本上,WCF 线程方案会根据所选的实例管理行为而变化,并且当在一段时间内没有请求到达服务时,WCF 可能会暂停正在运行的线程。所有这些都会给 UI 带来麻烦。
在这种情况下,我要做的是创建一个托管 WCF 的 Windows 服务,并创建一个 ServiceContract 以将所需的数据公开给监视 UI。这个 UI 将在它自己的 exe 中独立运行,作为服务的另一个客户端,根据需要从服务中获取数据。
我希望对你有意义。