c# - 如何在计时器上调用函数
问题描述
目标是连续保存文件,但我不知道如何在 C# 中制作计时器。那么我该怎么做这个 JavaScript 已知函数
setInterval(function(){ recurring_task(); }, 3000);
在 C# 中?
解决方案
除非您生成一个单独的线程来执行重复的任务,否则另一个答案中建议的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;
}
}
推荐阅读
- python - 程序python套接字
- c# - Stopwatch download speed calculate with other speed formats
- signature - How can we specify the attributes of a Callable argument in a subroutine
- c# - 将对象转换为浮点类型,但它看起来像 struct System.Single
- android - 在一个意图中请求更多环境目录
- javascript - 如何在字符串中搜索
- python - 根据 Groupby-function 的输出命名 pandas 数据框
- javascript - Why does the same code using getClientRects() produce different results?
- pytorch - can't find the inplace operation: one of the variables needed for gradient computation has been modified by an inplace operation
- python - 选择具有边界规则的感兴趣区域