c# - 动态使用计时器对象C#/。net

标签 c# .net multithreading timer thread-safety

我想看看是否有人对动态使用计时器有任何经验或提示。我们需要一个Windows服务,该服务会定期检查文本文件。文本文件将包含市场名称和开始时间。然后,该服务需要创建一个计时器来执行倒计时并将倒计时信息写到xml文件中……例如23minutes

所有这些现在都可以在Windows应用程序上运行一个计时器和一个倒计时...我们现在要使它动态化...

因此,当服务启动时,它将为每个市场/倒数时间创建一个计时器...(例如Phoenix 10 am、Chicago 11:45 pm等)。

然后,该服务将检查该文本文件中是否有任何新条目...因此,如果该文件包含Phoenix,Chicago,然后添加了New York,我们希望该服务保持Phoenix和Chicago计时器运行,然后为New启动计时器约克。

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

有什么想法吗?

最佳答案

im just not sure how multiple timers running under a service would interact and how the threading will work when they all need to write to the same xml file.

any thoughts on this?



效果不好。

计时器排队到线程池中。线程池一次只会创建一定数量的 Activity 线程:

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

The number of operations that can be queued to the thread pool is limited only by available memory; however, the thread pool limits the number of threads that can be active in the process simultaneously



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

更不用说,如果所有这些线程都在运行,那么弄清应用程序在做什么将变得更加困难。

一种更简单的方法

使用一个现有的计时器,并在不使用线程的基础上建立自己的计时系统。
  • 创建定义倒计时条目的结构。

  • 代码:
    public class Countdown
    {
        public DateTime Time { get; set; }
        public event Action Elapsed { get; set; }
    
        public void RaiseElasped()
        {
            if(Elapsed != null)
                Elapsed();
        }
    }
    
  • 读取文件,然后创建:Dictionary<string, Countdown>(名称->倒数)。在您要放入计时器的每个操作中放入相同的代码。
  • 创建FileSystemWatcher以查找对输入文件的更改。触发文件后,根据需要修改字典。
  • 创建一个分辨率为一分钟的计时器。
  • 每次触发计时器时,请检查字典中的每个项目。如果已超过目标时间,请调用RaiseElapsed。 (可能也将其从字典中删除?)

  • 从这一点出发,很难确切地确定您要做什么,因为您没有描述要写入文件的内容,发生的时间,发生的频率或倒计时结束后发生的事情。不过,您应该可以自己找出其余的部分。

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

    缺点是,当您有很多条目时,它可能会停滞不前。但是,如果您有很多条目,那么您实际上应该使用数据库而不是文件。

    关于c# - 动态使用计时器对象C#/。net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7236505/

    相关文章:

    c# - "message": "The SSL connection could not be established, see inner exception." in Windows Server 2012 R2

    c# - 在根据我输入的数据实例化 Unity 预制件后,如何更改它的 Sprite ?

    c# - 保留顺序的 HashSet

    C++/boost : how to signal async task completion?

    c# - 使用主题等 WPF 样式

    c# - 在没有焦点的情况下在 C# 中打开表单

    c# - .NET 线程像 Node.js/V8?

    c# - 在卷纸上打印

    c++ - 使用 Qt 和 QThread 的简单数字时钟

    c++ - 在另一个线程中绘制 OpenGL