我真的很挣扎。我正在winforms
Visual Studio 中创建一个应用程序,并且需要一个每半小时计时一次的后台计时器 - 这样做的目的是从服务器上拉下更新。
我尝试了几种不同的方法,但都失败了,要么是由于教程/示例不佳,要么是我自己在C#
. 我认为向您展示我迄今为止所做的尝试是浪费时间,因为我所尝试的似乎离目标很远。
有谁知道实现一个C#
新手容易理解的异步后台计时器的清晰简单的方法?
我真的很挣扎。我正在winforms
Visual Studio 中创建一个应用程序,并且需要一个每半小时计时一次的后台计时器 - 这样做的目的是从服务器上拉下更新。
我尝试了几种不同的方法,但都失败了,要么是由于教程/示例不佳,要么是我自己在C#
. 我认为向您展示我迄今为止所做的尝试是浪费时间,因为我所尝试的似乎离目标很远。
有谁知道实现一个C#
新手容易理解的异步后台计时器的清晰简单的方法?
// Create a 30 min timer
timer = new System.Timers.Timer(1800000);
// Hook up the Elapsed event for the timer.
timer.Elapsed += OnTimedEvent;
timer.Enabled = true;
...
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
// do stuff
}
通常需要注意的是:计时器不会非常准确,可能需要GC.KeepAlive(timer)
另请参阅:为什么 System.Timers.Timer 能在 GC 中存活,但 System.Threading.Timer 不能?
在表单中声明成员变量:
System.Timers.Timer theTimer;
在表单加载时(或您需要开始更新轮询的任何其他时间),请执行以下操作:
theTimer = new System.Timers.Timer(1800000);
theTimer.Elapsed += PollUpdates;
theTimer.Start();
像这样声明 PollUpdates 成员函数:
private void PollUpdates(object sender, EventArgs e)
{
}
我认为您需要了解所有计时器类。请参阅下面乔恩的回答。
你用的是什么定时器?
- System.Windows.Forms.Timer 将在 UI 线程中执行
- System.Timers.Timer 在线程池线程中执行,除非您指定 SynchronizingObject
- System.Threading.Timer 在线程池线程中执行其回调
在所有情况下,计时器本身都是异步的——它在触发之前不会“占用”线程。
资料来源:.NET 计时器是否异步运行?