等到计时器勾选特定次数

  • 本文关键字:计时器 c#
  • 更新时间 :
  • 英文 :


我试图使我的程序无能为力,直到计时器滴答两次(总共2秒)。我正在使用以下代码,除非我删除Whial语句,否则计时器将无法工作。

timer = 0;
Console.WriteLine("timer start ");
timer1.Start();
while (timer < 2);
Console.WriteLine("timer ends");
private void timer1_Tick(object sender, EventArgs e)
{
    Console.WriteLine(timer);
    timer++;
}

您应该使用System.Timers.Timer,它将在单独的线程中运行,请参阅此MSDN文章:

从上方链接:

System.Windows.Forms.Timer

如果您正在寻找节拍器,那么您来了错误的位置。此计时器类提出的计时器事件相对于Windows表单应用程序中的其余代码是同步的。这意味着正在执行的应用程序代码永远不会被此计时器类的实例抢占(假设您不调用application.doevents)。

System.Timers.Timer

.NET Framework文档指的是System.Timers.Timer类作为基于服务器的计时器,该计时器是设计和优化用于多线程环境中的。可以从多个线程安全访问此计时器类的实例。与System.Windows.Forms.Timer不同,System.Timers.Timer类默认情况下,将在从普通语言运行时(CLR)线程池获得的工作人员线程上调用您的计时器事件处理程序。这意味着您经过的事件处理程序内的代码必须符合Win32编程的黄金法则:绝不应从用于实例化其实例化的线程以外的任何线程中访问控件的实例

工作代码:

public partial class Form1 : Form
{
    System.Timers.Timer  tmr = new System.Timers.Timer(1000);
    volatile int timer;
    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Shown(object sender, EventArgs e)
    {
        timer = 0;
        tmr.Elapsed += new System.Timers.ElapsedEventHandler(tmr_Elapsed);
        tmr.Start();
        while (timer < 2) ;
        tmr.Stop();
        Console.WriteLine("timer ends");
    }
    void tmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        Console.WriteLine(timer);
        timer++;
    }
}

不确定您使用的是哪个计时器类(这很重要)。假设它类似于system.windows.forms.timer,tick从未发生,因为它在主事件循环中派遣了,并且您正在使用wirer循环绑定主事件循环。如果这是与GUI无关的计时器类,则可能由于缺乏线程同步而存在内存可见性问题。

我也很好奇为什么两个 tick?据推测,这是简化的代码,而您的timer_tick方法实际上正在做更有趣的事情?如果没有,您可以只是线程。Sleep(2000)。如果tick代码有些有趣,则可以在tick方法中处理完成,例如:

timer = 0;
Console.WriteLine("timer start ");
timer1.Start();
private void timer1_Tick(object sender, EventArgs e)
{
    Console.WriteLine(timer);
    if (++timer == 2) {
      Console.WriteLine("timer ends");
      // and you probably want a timer1.Stop() in here too
    }
}

最新更新