WCF中的后台线程

WCF中的后台线程

问题描述:

在Windows服务托管的WCF服务中创建后台线程是否是一种很好的做法?WCF中的后台线程

事情是这样的:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)] 
public class Service : IService 
{ 
    private void DoWork() 
    { 
    ... 
    } 

    public Service() 
    { 
     Thread thread = new Thread(new ThreadStart(DoWork)); 
     thread.Start(); 
    } 
} 
+1

不,我建议只使用** per-call **服务模型 - 每个请求都会获得自己的服务类副本,调用该服务方法,然后再次释放该实例。这并不需要处理棘手的线程安全问题和类似的东西 – 2015-04-04 18:08:12

+0

我的服务正在运行并侦听网络并通过Web API将消息发送到MVC服务器。对于per-call服务,我需要在MVC和双工通信中创建后台线程..所以我更喜欢在WCF中创建后台线程并将消息推送到MVC。你能解释一下,为什么这是一种不好的做法? – Michael 2015-04-04 18:39:09

+0

后台线程会做什么?它为什么需要存在? – usr 2015-04-04 19:03:09

所以,你有一个持续的过程,从一些源和中继它拉的数据。对于WCF中的后台线程来说,这是一个很好的例子,因为您的工作不是基于传入呼叫,而是无法做到。

请注意,由于无法控制的原因,IIS工作进程可能会在任何时间点关闭。而且,工作流程在回收时可能会重叠。这意味着在同一个框中,这个线程的两个实例可以同时运行。出于HA原因,如果您想在多台机器上运行此应用程序,情况也是如此。

Windows服务更稳定,但它们也必须可重新启动(例如,部署时或存在导致进程崩溃的错误时)。

此外请确保捕获该线程上发生的任何错误。未处理的异常会在不通知开发人员的情况下杀死进程。

既然你是在一个Windows服务托管,我看到没有理由维护Service类的构造函数中的线程。保持WCF之外的状态。例如在你的Windows服务类中。

+0

究其原因,我在WCF创建线程,那我就可以杀死它,并通过创建WCF接口一个新的。例如:public void StopListening(){thread.Abort();}和public void StartListening(){thread = new Thread(new ThreadStart(DoWork)); tread.start(); } ... – Michael 2015-04-05 12:23:26

+1

如果将线程存储在其他地方,则可以执行相同的操作。不需要混淆WCF实例化模式。还要注意,那个thread.abort是邪恶的。这不是一个可行的架构。 – usr 2015-04-05 12:27:16