首页 > 解决方案 > 如何在计时器上调用函数

问题描述

目标是连续保存文件,但我不知道如何在 C# 中制作计时器。那么我该怎么做这个 JavaScript 已知函数

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

在 C# 中?

标签: c#winformstimer

解决方案


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

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

使用单独线程的问题是同步:如果你这样做,你需要确保你的重复任务在你的主(gui)线程也在尝试访问数据结构的同时是安全的访问它们。

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

此示例代码直接取自 Microsoft 文档“如何:使用 Windows 窗体计时器组件以设置的间隔运行过程”,这是您在谷歌搜索“winforms 计时器”时收到的第一个结果。

它以一秒为增量跟踪一天中的时间。它在表单上使用 Button、Label 和 Timer 组件。Interval 属性设置为 1000(等于一秒)。在 Tick 事件中,标签的标题设置为当前时间。单击按钮时,已启用属性设置为 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;  
  }  
}  

推荐阅读