C# 如何在计时器上调用函数

C# 如何在计时器上调用函数,c#,winforms,timer,C#,Winforms,Timer,目标是连续保存文件,但我不知道如何用C#制作计时器。那么,我如何实现这个JavaScript已知函数呢 setInterval(function(){ recurring_task(); }, 3000); 在C#?中,您可以使用while循环,同时使用一些可以全局设置为停止循环的标志 例如: // define some flag in a class // in case of multithreaded app, use volatile keyword to make it threa

目标是连续保存文件,但我不知道如何用C#制作计时器。那么,我如何实现这个JavaScript已知函数呢

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

在C#?

中,您可以使用
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);
}

您可以使用以下内容:

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 
}
另一个答案中建议的
Thread.Sleep(_specifiedTimeInMs)
方法将不起作用,除非生成一个单独的线程来执行重复的任务

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

使用单独线程的问题是同步:如果采用这种方式,则需要确保重复任务在主(gui)线程尝试访问数据结构的同时尝试访问数据结构是安全的

如果周期性任务很长,那么除了在单独的线程中执行周期性任务外,您可能没有任何其他选项,以便在周期性任务执行时不冻结gui线程。但是,如果您的重复任务很快,那么使用常规winforms计时器在gui线程中尝试并执行它就容易多了

此示例代码直接取自Microsoft文档,这是您在谷歌搜索“winforms timer”时收到的第一个结果之一

它以1秒为增量跟踪一天中的时间。它在表单上使用按钮、标签和计时器组件。Interval属性设置为1000(等于1秒)。在勾号事件中,标签的标题设置为当前时间。单击按钮时,Enabled属性设置为false,阻止计时器更新标签的标题。下面的代码示例要求您有一个表单,其中包含一个名为Button1的按钮控件、一个名为Timer1的计时器控件和一个名为Label1的标签控件

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;  
  }  
}  

你有没有在谷歌上搜索过“如何在C#中创建计时器”?计时器往往非常特定于你运行的操作环境。因此,您需要告诉我们您的代码针对的是什么环境,以便告诉您可以使用什么类型的计时器。它是一个控制台应用程序吗?WinForms应用程序?WPF应用程序?Web服务器应用程序?来吧,告诉我们。这是一个winform应用程序,目标只是不断地写入到相同的.bpm文件中,我随后将在RTS中对其进行流式处理。这完全符合您的要求。如果全局标志是私有的,那么它也需要是易失性的,否则编译器会将您的while循环编码为
while(true)
考虑在另一个线程中启动此方法
不是您应该在回答中给出的注释。首先,这是一件错失的大事,其次,大约99.9%的人确定这种方法需要在另一个线程中处理。这意味着您还需要使用上述代码以某种方式保存图像?这个答案带来的问题比问题本身更多。