WCF 中的后台线程

Background threads in WCF

在由 Windows 服务托管的 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();
    }
}

所以你有一个连续的过程,从某个来源提取数据并转发它。对于 WCF 中的后台线程来说,这是一个很好的例子,因为您的工作不是基于传入调用,也无法做到这一点。

请注意,IIS 工作进程可能会出于您无法控制的原因随时关闭。此外,工作进程在回收时可能会重叠。这意味着在同一个盒子上,该线程的两个实例可以同时 运行ning。如果您想 运行 出于 HA 原因在多台计算机上使用此应用程序,情况也是如此。

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

还要确保捕获该线程上发生的任何错误。未处理的异常会在不通知开发人员的情况下终止进程。

由于您托管在 Windows 服务中,我认为没有理由在 Service class 的构造函数中维护线程。在 WCF 之外维护状态。例如在您的 Windows 服务中 class.