在Windows服务(通过webHttpBinding)中托管的WCF单例中的计时器意外死亡



我有一个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的构造函数。其中一个什么都不做。在那上面你有单独的计时器列表。这有点复杂。请隔离的问题,也许张贴新的代码后,

我还没有特别遇到这个问题——但是,如果你只是想让计时器在服务运行时运行,为什么不把它设置为静态呢?那么您的实例上下文模式和实例生存期将不会影响您的功能。

相关内容

  • 没有找到相关文章

最新更新