【发布时间】:2014-08-22 07:44:59
【问题描述】:
我有一个由 IIS 7.5 托管的 WCF 服务,其中包含静态变量。
该服务被称为零星的,并且有一段时间变量保持它们的值。
但是有时它们会丢失值并重新初始化-我不知道为什么。
首先我认为这是因为应用程序池回收,所以我将回收间隔更改为无限 - 但它仍然发生。
我在任务管理器中观察到 w3wp.exe:在静态变量重置发生后它仍然具有相同的 PID,对服务的新调用转到同一个工作进程 - 所以我们可以排除应用程序池回收,对吗?
那么那里发生了什么,我该如何解决它,有什么想法吗?
本服务使用
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
这里是我做的几个测试的结果:
当我阻止调用由 Thread.Sleep() 返回时甚至会发生这种情况,因此也可以排除工作进程的空闲超时(设置为 20 分钟)吗?有时它会在静态重置之前运行几个小时。
但似乎“旧”等待线程仍然存在,因为我可以通过外部信号使其继续运行(在无限循环中的睡眠之间 X 秒后检查 SQL 表条目)。
它就像“另一个世界”,静态变量仍然存在并且线程继续运行,但是来自随机时间的每个新调用都在一个带有新变量的新世界中运行......
有人解决这个问题吗?
2014 年 8 月 28 日
对这件事没有想法?
几个测试表明:没有真正的“重置”发生,而是在某个未知/随机时间,当我进行服务调用(用于测试)时,静态构造函数被调用,静态变量被设置为其初始值。好像应用程序池之前被回收了一样。但它没有——我观察了事件日志(过滤器:源“WAS”)——没有回收。
这到底是怎么回事?
【问题讨论】: