动态使用计时器对象c#/ .net

时间:2011-08-29 22:02:00

标签: c# .net multithreading timer thread-safety

我想知道是否有人有动态使用计时器的经验或提示。我们需要一个定期检查文本文件的Windows服务。文本文件将包含市场名称和开始时间。然后该服务需要创建一个计时器来执行倒计时并将倒计时信息写入xml文件...如23分钟

现在所有这些都适用于Windows应用程序上的一个计时器和一个倒计时......现在我们想让这个动态...

所以当服务开始时,它会为每个市场/倒计时时间创建一个计时器......(早上10点凤凰城,芝加哥晚上11点45分等)。

然后该服务将检查该文本文件是否有任何新条目...所以如果该文件有凤凰城,芝加哥然后添加纽约,我们希望该服务保持凤凰城和芝加哥计时器运行然后开始纽约的计时器。

我只是不确定在服务下运行的多个计时器如何交互,以及当它们都需要写入同一个xml文件时线程如何工作。

对此有何看法?

2 个答案:

答案 0 :(得分:2)

  

我只是不确定在服务下运行的多个计时器如何交互,以及当它们都需要写入同一个xml文件时线程如何工作。

     

对此有何看法?

效果不佳。

计时器排队到线程池。线程池一次只能创建一定数量的活动线程:

http://msdn.microsoft.com/en-us/library/0ka9477y.aspx

  

可以排队到线程池的操作数仅受可用内存的限制;但是,线程池限制了同时在进程中处于活动状态的线程数

此外,从多个线程写入同一文件会给你带来不好的结果。

更不用说如果所有这些线程都在运行,弄清楚你的应用程序正在做什么会更加困难。

更简单的方法

使用现有的计时器并在不使用线程的情况下构建自己的计时系统。

  • 创建定义倒计时条目的结构。

代码:

public class Countdown
{
    public DateTime Time { get; set; }
    public event Action Elapsed { get; set; }

    public void RaiseElasped()
    {
        if(Elapsed != null)
            Elapsed();
    }
}
  • 阅读您的文件,然后创建:Dictionary<string, Countdown>(姓名 - &gt;倒计时)。将相同的代码放在您将要添加到计时器中的每个操作中。

  • 创建FileSystemWatcher以查找输入文件的更改。触发文件时,根据需要修改字典。

  • 创建一个分辨率为一分钟的计时器。

  • 每次触发计时器时,请检查字典中的每个项目。如果目标时间已过,请致电RaiseElapsed。 (也可以从字典中删除它?)

从这一点来看,很难确切地确定你想要做什么,因为你没有描述写入文件的内容,发生的时间,频率或倒计时结束后会发生什么。不过,你应该能够自己弄清楚其余部分。

这种方法的优点是单线程程序更容易调试,并且您不会得到任何问题(并发文件访问或运行太多线程)的问题。

缺点是当你有很多条目时它可能会陷入困境。但是如果你有很多条目,你应该真的使用数据库而不是文件。

答案 1 :(得分:1)

您可以维护保存市场名称和时间的Dictionary<string,DateTime>。每隔一段时间(例如每分钟?),您可以通过简单地使用DateTime.Subtract()扫描字典并计算经过的时间,并将结果写入输出文件。您可能还想查看Stopwatch class