如何在计时器上调用函数

时间:2019-07-16 10:33:46

标签: c# winforms timer

目标是连续保存文件,但我不知道如何在C#中创建计时器。那么我该怎么做这个JavaScript已知的功能

setInterval(function(){ recurring_task(); }, 3000);

在C#中?

3 个答案:

答案 0 :(得分:1)

除非您生成单独的线程来执行重复的任务,否则另一个答案中建议的Thread.Sleep(_specifiedTimeInMs)方法将不起作用。

Task.Delay().ContinueWith()方法使您不必手动启动单独的线程,但是它将在后台使用单独的线程。

使用单独的线程的问题是同步:如果采用这种方式,则需要确保定期执行的任务在尝试与主(gui)线程同时访问数据结构时是安全的也在尝试访问它们。

如果重复任务很长,那么您可能别无选择,只能在单独的线程中执行重复任务,以免在重复任务执行任务时冻结gui线程。但是,如果您的重复任务很快,那么使用常规的winforms计时器在gui线程中尝试执行此操作会容易得多。

此示例代码直接取自Microsoft文档"How to: Run Procedures at Set Intervals with the Windows Forms Timer Component",这是如果您使用Google“ winforms timer”收到的第一个结果。

它以一秒为增量跟踪一天中的时间。它在窗体上使用一个按钮,一个标签和一个计时器组件。时间间隔属性设置为1000(等于一秒)。在“滴答”事件中,标签的标题设置为当前时间。单击该按钮时,Enabled属性设置为false,从而停止计时器更新标签的标题。下面的代码示例要求您具有一个窗体,其中包含一个名为Button1的Button控件,一个名为Timer1的Timer控件和一个名为Label1的Label控件。

private void InitializeTimer()  
{  
    // Call this procedure when the application starts.  
    // Set to 1 second.  
    Timer1.Interval = 1000;  
    Timer1.Tick += new EventHandler(Timer1_Tick);  

    // Enable timer.  
    Timer1.Enabled = true;  

    Button1.Text = "Stop";  
    Button1.Click += new EventHandler(Button1_Click);  
}  

private void Timer1_Tick(object Sender, EventArgs e)     
{  
   // Set the caption to the current time.  
   Label1.Text = DateTime.Now.ToString();  
}  

private void Button1_Click(object sender, EventArgs e)  
{  
  if ( Button1.Text == "Stop" )  
  {  
    Button1.Text = "Start";  
    Timer1.Enabled = false;  
  }  
  else  
  {  
    Button1.Text = "Stop";  
    Timer1.Enabled = true;  
  }  
}  

答案 1 :(得分:0)

您可以将while循环与可以全局设置以停止循环的某些标志一起使用。

类似:

// define some flag in a class
// in case of multithreaded app, use volatile keyword to make it thread safe
private bool _globalFlag = true;
// then in your method use the flag
while(_globalFlag)
{
  // save your file
  // consider starting this method in another thread, so your main thread won't get blocked
  Thread.Sleep(_specifiedTimeInMs);
}

答案 2 :(得分:0)

您可以使用以下内容:

public void foo()
{
    Task.Delay(3000).ContinueWith(t=> bar());
}

public void bar()
{
    // do stuff
    foo();   //This will run the next bar() in 3 seconds from now 
}