在C#中使用计时器线程

时间:2010-12-07 23:49:28

标签: c# .net multithreading timer

我正在做一个需要某种系统时钟的应用程序,一个计算滴答的时钟。我应该能够得到计数值并设置它。

我在Python语言中使用Thread库完成了它,但我不能用C#中的Timer类做同样的事情。作为.NET的新手,我不确定这个计时器类是如何工作的。我希望能够使用.NET实现相同的时钟。

这是我的Python代码,因此您可以了解我正在谈论的内容。

class SystemClock(threading.Thread):

  def __init__(self , timeUnit , sched):
      self.val = 0

      self.unit = timeUnit
      self.stp= False
      self.sched = sched
      threading.Thread.__init__(self)

  def run(self):
      while not self.stp:
          self.val +=1
          time.sleep(self.unit)

  def getSystemTime(self):
      return self.val

  def stop(self):
      self.stp = True

感谢您的帮助;

3 个答案:

答案 0 :(得分:3)

为什么不使用System.Diagnostics.Stopwatch,因为完全它的用途。

// at the start of your program
Stopwatch SystemClock = Stopwatch.StartNew();

// any time you want to see how much time has elapsed
long ticks = SystemClock.ElapsedTicks;

如果你真的需要能够设置值,那么将它包装在一个具有base_time值(以刻度表示)的类中,然后将经过的刻度添加到基准时间以获得时间想。

答案 1 :(得分:1)

为什么你不只是在开始时检索一个DateTime,并且根据需要获得该值,是否有任何理由使用DateTime.Now.Subtract(origDateTime)并使用TimeSpan结果来满足您的需求?或者每次滴答都会更新一些内容吗?

修改 此外,与Timers一样,您设置了“Tick”间隔,因此您无需将它们休眠。每个tick都会执行回调,省去了使用while ... sleep的麻烦。但裸线绑定,而在线程领域,我无法验证因为我已经使用了定时器已经有一段时间了,你可能需要锁定()你正在修改的变量,因为它在一个单独的线程中,因为没有什么是确保另一种方法不会改变相同的值。

<强> EDITv3

这是编辑的第3版。你有两个类,都避免使用定时器(你的CPU以后会感谢我;-p)SystemClock是一个典型的每秒间隔率。 VariableSystemClock允许您指定增加的比率。我还改变了从属性到方法获取值的方式,甚至使用了继承。 ; - )

SystemClock.cs

public class SystemClock
{
    protected DateTime _start;

    public SystemClock()
    {
        this._start = DateTime.UtcNow;
    }

    public virtual Int32 getSystemTime()
    {
        return Convert.ToInt32(Math.Floor(DateTime.UtcNow.Subtract(this._start).TotalSeconds));
    }
}

VariableSystemClock.cs

public class VariableSystemClock : SystemClock
{
    private TimeSpan _interval;

    public VariableSystemClock(TimeSpan interval)
        : base()
    {
        this._interval = interval;
    }

    public override Int32 getSystemTime()
    {
        Double ellapsed = DateTime.UtcNow.Subtract(this._start).Ticks / this._interval.Ticks;
        return Convert.ToInt32(Math.Floor(ellapsed));
    }
}

program.cs(所以你可以在控制台应用程序中测试它(project-&gt; new-&gt;控制台应用程序)

class Program
{
    static void Main(string[] args)
    {
        SystemClock oncePerSecond = new SystemClock();
        VariableSystemClock oncePerInterval = new VariableSystemClock(TimeSpan.FromSeconds(2));

        Console.WriteLine("Start:");
        Console.WriteLine("  oncePerSecond:   {0}", oncePerSecond.getSystemTime());
        Console.WriteLine("  oncePerInterval: {0}", oncePerInterval.getSystemTime());
        Console.WriteLine();

        for (Int32 i = 0; i < 10; i++)
        {
            // sleep three seconds
            System.Threading.Thread.Sleep(TimeSpan.FromSeconds(2));

            // display output
            Console.WriteLine("Interval {0}:", i);
            Console.WriteLine("  oncePerSecond:   {0}", oncePerSecond.getSystemTime());
            Console.WriteLine("  oncePerInterval: {0}", oncePerInterval.getSystemTime());
            Console.WriteLine();
        }

        Console.WriteLine("End:");
        Console.WriteLine("  oncePerSecond:   {0}", oncePerSecond.getSystemTime());
        Console.WriteLine("  oncePerInterval: {0}", oncePerInterval.getSystemTime());
        Console.WriteLine();
    }
}

随意使用oncePerInterval结构和for循环中的Sleep。

答案 2 :(得分:0)

Thread Timers可能更适合您的目标。