WCF中长时间运行的异步线程

时间:2010-12-18 10:34:51

标签: c# multithreading wcf

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

线程运行正常,但在20分钟内我们收到错误消息:
“主题已中止”

线程已经死了。

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

你能否提出这个问题的根源?

谢谢你的答案。

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:7)

IIS6有一个设置,它会在没有请求的预定义时间后关闭应用程序池,默认为20分钟。这似乎是你遇到的。您可以在App Pool properties =>下找到此设置。 Performance Tab =>删除“闲置后关闭工作进程”中的复选标记。

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

答案 2 :(得分:2)

您可以让Windows服务主机成为启动长期运行任务的WCF端点。 Windows服务意味着运​​行很长很长时间,非常适合这种情况。