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.
在由 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.