我有一个托管在 Windows 服务中的 WCF 服务(在本地系统下运行)。我在里面运行一个 System.Timer。初始化 Timer的操作o1是通过 webHttpBinding 的 http 端点声明的。我为 System.ServiceModel 启用了跟踪,并从 .svcLog 文件中检查了操作 o1 的侦听持续时间。它表明,在运行大约 20 小时后,http 端点处的侦听刚刚停止。
我认为这是因为没有传入消息到达该端点。这里的问题是监听停止,我的计时器(在那个特定的操作o1中初始化)也停止了!
有没有推荐的方法来保持监听器,因此计时器,长时间保持?我们可以定期 ping o1 操作以将其保存在内存中吗?
另外,我在操作 o1 中初始化的计时器变量是一个实例变量,即使侦听器关闭,这个变量是否也应该在内存中(WCF 是单例)?
非常感谢。
代码摘录-
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public class SchedulerWindows : ISchedulerWindows
{
///.........all instance variables.....
DataTimer timer = null; /**DataTimer wraps a System.Timers timer variable**/
public List<DataTimer> timersInService = new List<DataTimer>();
public ISchedulerWindows.o1(string s1, string s2, /*********/)
{
//..........//
timer = new DataTimer();
}
}
public class DataTimer
{
/****Newly introduced System.Threading.Timer, previously I was using System.Timers.Timer which was dying****/
public System.Threading.Timer thTimer;
private static readonly object dbAccessLock = new object();
private static readonly object thCallbackLock = new object();
public DataTimer()
{
}
public DataTimer(/************/)
{
TimerCallback timerDelegate = new TimerCallback(this.WorkMethod);
EventLogLogger l = new EventLogLogger();
//l.LogMessage("setting up timer ");
thTimer = new Timer(this.WorkMethod, null, 0, period);
}
...
}
编辑:从 System.Timers 命名空间更改为 System.Threading 命名空间并增加定时间隔为我修复了它。计时器变量不再消失。