【问题标题】:Timer in WCF server gets duplicated every timeWCF 服务器中的计时器每次都会重复
【发布时间】:2017-01-02 15:26:38
【问题描述】:

我有一个托管在 Windows Azure 中的 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();
    }

但这永远不会被调用...我还测试了一个静态计时器,但它也没有启动。

我做错了什么?

【问题讨论】:

  • WCF 服务不是“活着”的东西,它被调用一次然后被丢弃,直到再次调用。这是一个放置计时器的非常糟糕的地方,根据定义,它需要长时间存活。不过,您的服务代码对我来说就像一个 Windows 服务。你能解释一下这段代码是什么以及它的去向吗?
  • 如果您想要类似于 WCF 服务且能够保持活动状态并按计时器执行“工作”的功能,为什么不使用 Windows 服务。这是一个简短的教程:msdn.microsoft.com/en-us/library/…
  • @nvoigt 这是一个学校项目,它需要是一个 WCF 服务,它是一个电子宠物,所有的逻辑都在 de WCF 服务中。 ASP en WPF 应用程序只显示电子宠物并给它们食物等。WCFService_Elapsed 方法每 10 秒在数据库中随机化一次统计信息。由于这个原因,电子宠物可能会死,而你不得不与它们互动。
  • 您能否详细介绍一下您的服务的 WCF 到底是什么?因为它听起来和读起来都像普通的 Windows 服务。
  • @nvoigt 我不明白你的意思,我猜你很困惑,因为我使用了不是标准 WCF 方法的 OnStart 方法。我用这个方法作为测试,但不幸的是它不起作用。

标签: c# wcf azure timer


【解决方案1】:

Timer 继承 IDisposable,这意味着 Timer 可以并且应该被释放。

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

所以在你的 OnStop 方法中你应该调用:

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

【讨论】:

  • 如果出于任何原因不应调用 OnStop,您可以让您的 Service1 类从 IDisposable 继承并执行 timer.Stop() 和 timer.Dispose();在您的处置方法中。
  • Onstop 方法根本不起作用,这是因为它是一个 WCF 应用程序,它没有标准实现 ServiceBase。如果我从 Idisposable 继承,我将收到 StackOverflowException。
猜你喜欢
  • 2015-02-28
  • 1970-01-01
  • 2020-03-28
  • 2015-11-04
  • 2022-11-17
  • 2019-05-04
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
相关资源
最近更新 更多