C# WCF服务器中的计时器每次都会重复

C# WCF服务器中的计时器每次都会重复,c#,wcf,azure,timer,C#,Wcf,Azure,Timer,我在WindowsAzure中托管了一个WCF服务。我在这台服务器上使用计时器,每隔10秒服务器就需要更新一些东西。服务器在ASP应用程序和WPF应用程序中实现 当我在构造函数中初始化计时器时,如下所示: public Service1() { System.Timers.Timer timer = new System.Timers.Timer(); timer.Elapsed += new System.Timers.ElapsedEventHandler(WCFServic

我在WindowsAzure中托管了一个WCF服务。我在这台服务器上使用计时器,每隔10秒服务器就需要更新一些东西。服务器在ASP应用程序和WPF应用程序中实现

当我在构造函数中初始化计时器时,如下所示:

public Service1()
{
    System.Timers.Timer timer = new System.Timers.Timer();
    timer.Elapsed += new System.Timers.ElapsedEventHandler(WCFService_Elapsed);
    timer.Interval = 10000;
    timer.Enabled = true;
    timer.Start();
}
计时器将启动,但如果我重新启动应用程序,计时器将运行得更快(因为它运行的是计时器的副本)。将构造函数上方的计时器声明为私有属性并不起作用

我已经尝试在ServiceBase类的OnStart方法中使用它:

private System.Timers.Timer timer;
    protected override void OnStart(string[] args)
    {
        timer = new System.Timers.Timer();
        timer.Elapsed += new System.Timers.ElapsedEventHandler(WCFService_Elapsed);
        timer.Interval = 10000;
        timer.Enabled = true;
        timer.Start();
    }
但是这个从来没有被打过电话。。。我还测试了一个静态计时器,但也没有启动


我做错了什么?

计时器继承IDisposable,这意味着计时器可以而且应该被释放

我很惊讶,当关闭服务时,计时器仍在运行,但您应该在停止服务时进行处理以解决问题

因此,在OnStop方法中,您应该调用:

timer.Stop();
timer.Dispose();

如果出于任何原因不应调用OnStop,也可以使Service1类从IDisposable继承,并执行timer.Stop()和timer.Dispose();在您的Dispose-Method中,Onstop方法在al中不起作用,这是因为它是一个WCF应用程序,而不是标准的实现ServiceBase。如果我从Idisposable继承,我将收到StackOverflowException。WCF服务不是“存在”的东西,它会被调用一次,然后被丢弃,直到再次调用。这是一个放置计时器的非常糟糕的地方,根据定义,计时器需要长时间处于活动状态。不过,您的服务代码在我看来像是windows服务。你能解释一下这段代码是什么以及它去了哪里吗?如果你想要一个类似于WCF服务的东西,并且能够保持活动状态并按照计时器“工作”,为什么不使用windows服务呢。这里有一个简短的教程:@nvoigt这是一个学校项目,它需要一个WCF服务,它需要一个tamagotchi,所有的逻辑都在de WCF服务中。ASP en WPF应用程序只显示tamagotchi的,并给他们食物等。WCFService_appeased方法在数据库中每隔10秒随机统计一次。因此,tamagotichis可能会消亡,你不得不与他们互动。你能更详细地说明你的服务的WCF到底是什么吗?因为它听起来和读起来都像一个普通的windows服务。@nvoigt我不知道你的意思,我想你会感到困惑,因为我使用的OnStart方法不是标准的WCF方法。我用这个方法作为测试,但不幸的是它不起作用。