WCF中的长时间异步线程

6

有一个长时间运行的异步线程的WCF服务。 这个长时间运行的操作可能超过1天。 我们正在IIS 6上托管WCF服务。

线程正常运行,但在20分钟后我们收到错误消息:
"线程已中止"

结果线程死亡。

我们的WCF服务配置:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]

你能提供这个问题的来源吗?

感谢您的回答。

3个回答

9
如果这个web服务没有任何活动(即没有请求),IIS可能会决定卸载应用程序域,这当然会导致所有线程被终止。默认值为20分钟,可以在IIS中的应用程序池属性中进行配置。还有其他因素可能会导致应用程序池被回收,例如系统运行内存不足。因此,在IIS中托管这样的东西可能不可靠。您可以考虑在Windows服务中托管长时间运行的任务。

@Artur,请检查应用程序池的设置,尽管我非常强烈建议您使用Windows服务来执行此类任务。 - Darin Dimitrov
2
谢谢。我认为我们应该在Windows服务中托管它。 - Artur Okolity

7

IIS6有一个设置,可以在没有请求的预定义时间后关闭应用程序池,默认为20分钟。看起来这就是你遇到的问题。您可以在应用程序池属性下找到此设置 => 性能选项卡 => 取消“闲置一段时间后关闭工作进程”的复选框。

总体而言,在IIS下托管长时间运行的任务被认为是一个坏主意,因为有很多事情可能会中止线程或完全关闭进程,其中最突出的是应用程序池回收。


2

你可以使用Windows服务来托管WCF终结点来启动长时间运行的任务。Windows服务旨在长时间运行,非常适合这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接