【发布时间】: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 方法。我用这个方法作为测试,但不幸的是它不起作用。