C# 在C中使用计时器线程#

C# 在C中使用计时器线程#,c#,.net,multithreading,timer,C#,.net,Multithreading,Timer,我正在做一个需要某种系统时钟的应用程序,一个计算滴答声的时钟。我应该能够得到计数值并设置它 我已经用Python语言中的线程库完成了这项工作,但是我不能用C#中的定时器类完成同样的工作。作为.NET的新手,我不确定这个计时器类是如何工作的。我希望能够使用.NET实现相同的时钟 这是我的Python代码,因此您可以了解我所说的内容 class SystemClock(threading.Thread): def __init__(self , timeUnit , sched):

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

我已经用Python语言中的线程库完成了这项工作,但是我不能用C#中的定时器类完成同样的工作。作为.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

我感谢你的帮助

有什么理由不在开始时检索日期时间,并在需要时使用
DateTime.Now.Subtract(origDateTime)
并根据需要使用TimeSpan结果?还是每次都在更新

编辑 此外,与计时器一样,您可以设置一个“滴答”间隔,这样您就不需要让它们睡觉。每一个勾号都会执行回调,省去了你使用一段时间…睡眠的麻烦。但是在bind中,在线程区域中,我无法验证,因为我已经使用了一段时间的计时器,您可能需要锁定()正在修改的变量,因为它位于单独的线程中,因为没有任何东西可以确保另一个方法不会更改相同的值

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));
    }
}
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));
    }
}
VariableSystemClock.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));
    }
}
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->new->console应用程序)中测试它)

类程序
{
静态void Main(字符串[]参数)
{
SystemClock oncePerSecond=新系统时钟();
VariableSystemClock oncePerInterval=新的VariableSystemClock(TimeSpan.FromSeconds(2));
Console.WriteLine(“开始:”);
WriteLine(“oncePerSecond:{0}”,oncePerSecond.getSystemTime());
WriteLine(“oncePerInterval:{0}”,oncePerInterval.getSystemTime());
Console.WriteLine();
对于(Int32 i=0;i<10;i++)
{
//睡三秒
系统.线程.线程.睡眠(TimeSpan.FromSeconds(2));
//显示输出
WriteLine(“间隔{0}:”,i);
WriteLine(“oncePerSecond:{0}”,oncePerSecond.getSystemTime());
WriteLine(“oncePerInterval:{0}”,oncePerInterval.getSystemTime());
Console.WriteLine();
}
控制台写入线(“结束:”);
WriteLine(“oncePerSecond:{0}”,oncePerSecond.getSystemTime());
WriteLine(“oncePerInterval:{0}”,oncePerInterval.getSystemTime());
Console.WriteLine();
}
}

可以在for循环中随意使用oncePerInterval构造和Sleep。

有什么理由不在开始时检索DateTime,并在需要时使用
DateTime.Now.Subtract(origDateTime)来获取该值
并使用TimeSpan结果来满足您的需要?或者这是在每次勾选时都会更新某些内容吗

编辑 此外,与计时器一样,您可以设置一个“滴答”间隔,因此不需要休眠它们。每个滴答都将执行回调,省去了使用一段时间的麻烦…休眠。但是在绑定中,在线程区域中,我无法验证,因为我已经使用计时器一段时间了,您可能需要锁定()您正在修改的变量位于单独的线程中,因为没有任何东西可以确保另一个方法不会更改相同的值

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));
    }
}
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));
    }
}
VariableSystemClock.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));
    }
}
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->new->console应用程序)中测试它)

类程序
{
静态void Main(字符串[]参数)
{
SystemClock oncePerSecond=新系统时钟();
VariableSystemClock oncePerInterval=新的VariableSystemClock(TimeSpan.FromSeconds(2));
Console.WriteLine(“开始:”);
WriteLine(“oncePerSecond:{0}”,oncePerSecond.getSystemTime());
WriteLine(“oncePerInterval:{0}”,oncePerInterval.getSystemTime());
Console.WriteLine();
对于(Int32 i=0;i<10;i++)
{
//睡三秒
系统.线程.线程.睡眠(TimeSpan.FromSeconds(2));
//显示输出
WriteLine(“间隔{0}:”,i);
WriteLine(“oncePerSecond:{0}”,oncePerSecond.getSystemTime());
WriteLine(“oncePerInterval:{0}”,oncePerInterval.getSystemTime());
Console.WriteLine();
}
控制台写入线(“结束:”);
WriteLine(“oncePerSecond:{0}”,oncePerSecond.getSystemTime());
WriteLine(“oncePerInterval:{0}”,oncePerInterval.getSystemTime());
Console.WriteLine();
}
}

您可以在for循环中自由使用oncePerInterval构造和Sleep。

可能更符合您的要求。

可能更符合您的要求。

为什么不直接使用
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\u time
值(以ticks为单位)的类中,然后将经过的ticks添加到