对 WCF Windows 服务中的长 运行 线程的担忧
Concerns about long running thread in WCF Windows Service
我们正在使用 WCF 服务并将其托管在我们的 Windows 服务中。这个概念解释 here.
我们有一个看起来像这样的 WCF 服务调用:
[System.ServiceModel.OperationContractAttribute(...)]
[System.ServiceModel.FaultContractAttribute(...)]
void TriggerLongRunningOperation(int id);
在这个 WCF 调用中,我们分离出一些即发即弃的新线程来完成一些后台任务。大多数情况下,只有一个,但也可能有多个。 WCF 请求基本上立即完成,即发即弃线程执行其工作。
Task task = Task.Run(() =>
{
// some stuff.
});
分拆出来的操作可以持续 2 分钟到 1 小时不等。
我担心 WCF 进程中有一个长 运行 线程,但是,由于它不是通过 IIS 托管的,我们不必担心应用程序池回收。
当 运行 托管在 Windows 服务中的 WCF 服务中的新线程时,我应该注意什么问题?什么情况下线程会中止?
.NET 4.5.2
我会担心可靠性。这些线程可能会因为异常或系统重启或许多其他线程可能丢失的情况而中止。
此外,我想说 即发即忘 方法与可靠性无关:它只是意味着调用者不关心整个操作的结果.
因此,我会寻找一些可靠的消息队列,如 RabbitMQ。也就是说,您将在另一个线程中异步处理这些 触发后遗忘操作,如果之前出现问题,您将能够重试它们他们最终成功了。
我们正在使用 WCF 服务并将其托管在我们的 Windows 服务中。这个概念解释 here.
我们有一个看起来像这样的 WCF 服务调用:
[System.ServiceModel.OperationContractAttribute(...)]
[System.ServiceModel.FaultContractAttribute(...)]
void TriggerLongRunningOperation(int id);
在这个 WCF 调用中,我们分离出一些即发即弃的新线程来完成一些后台任务。大多数情况下,只有一个,但也可能有多个。 WCF 请求基本上立即完成,即发即弃线程执行其工作。
Task task = Task.Run(() =>
{
// some stuff.
});
分拆出来的操作可以持续 2 分钟到 1 小时不等。
我担心 WCF 进程中有一个长 运行 线程,但是,由于它不是通过 IIS 托管的,我们不必担心应用程序池回收。
当 运行 托管在 Windows 服务中的 WCF 服务中的新线程时,我应该注意什么问题?什么情况下线程会中止?
.NET 4.5.2
我会担心可靠性。这些线程可能会因为异常或系统重启或许多其他线程可能丢失的情况而中止。
此外,我想说 即发即忘 方法与可靠性无关:它只是意味着调用者不关心整个操作的结果.
因此,我会寻找一些可靠的消息队列,如 RabbitMQ。也就是说,您将在另一个线程中异步处理这些 触发后遗忘操作,如果之前出现问题,您将能够重试它们他们最终成功了。