我有一个WCF服务托管在Windows服务(在本地系统下运行)。我在运行一个系统。里面有计时器。初始化Timer的Operation 1是在webHttpBinding的http端点上声明的。我为系统启用了跟踪。从. svclog文件中,我检查了操作1的侦听持续时间。它显示,在运行大约20小时后,http端点的侦听只是停止。
我认为这是因为没有传入消息到达该端点。这里的问题是,随着侦听停止,我的计时器(在特定操作 01 中初始化)也停止了!
是否有一种推荐的方法来保持侦听器和计时器长时间处于启动状态?我们是否可以定期ping 01操作以将其保存在内存中?
此外,我的定时器变量,我初始化的操作01是一个实例变量,是不是这个变量预计是在内存中(WCF是一个单例),即使侦听器关闭??
谢谢你。
代码Exceprts -
[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);
}
...
}
EDIT: change to System。来自系统的线程命名空间。计时器命名空间和增加时间间隔为我解决了这个问题。timer变量不再消失
您的问题最有可能的原因是InstanceContextMode。如果你希望你的服务实例总是在内存中,你应该使用Single。你可能有PerSession或PerCall这就解释了为什么你的计时器消失了。你提到你的服务是单一的,但症状很可疑。在关闭主机之前,服务实例将保留在内存中。
[ServiceBehavior(
ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.Single
)]
来自WCF实例管理:
单例服务是永久存在的,并且只会在主机关闭。单例对象只在宿主创建时创建一次创建.
编辑:当你的监听器停止监听和定时器消失时,你可能检查了windows服务仍在运行。查看ServiceHost本身是否留在内存中也是有意义的。你也可以在ServiceHosts 'Closing', 'Closed'和'Faulted'事件处理程序中添加一些日志。
编辑2:如果你的计时器消失了,你应该看看你是如何分配它的。它很可能被垃圾收集。您必须将其声明为可从活动对象访问的实例字段。让它保持静态以确保绝对可靠。您为DataTimer
这样做,但不清楚如何在DataTimer
中声明和分配计时器。请贴一些代码。
编辑3:您不应该在操作中创建计时器。如果操作被调用了不止一次会发生什么?老家伙会怎么样?我看不出你是怎么处理它的。您似乎也有两个DataTimer的构造函数。其中一个什么都不做。在那上面你有单独的计时器列表。这有点复杂。请隔离的问题,也许张贴新的代码后,
我还没有特别遇到这个问题——但是,如果你只是想让计时器在服务运行时运行,为什么不把它设置为静态呢?那么您的实例上下文模式和实例生存期将不会影响您的功能。