26

我真的很挣扎。我正在winformsVisual Studio 中创建一个应用程序,并且需要一个每半小时计时一次的后台计时器 - 这样做的目的是从服务器上拉下更新。

我尝试了几种不同的方法,但都失败了,要么是由于教程/示例不佳,要么是我自己在C#. 我认为向您展示我迄今为止所做的尝试是浪费时间,因为我所尝试的似乎离目标很远。

有谁知道实现一个C#新手容易理解的异步后台计时器的清晰简单的方法?

4

3 回答 3

38
    // 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 不能?

于 2013-04-08T12:54:18.800 回答
11

在表单中声明成员变量:

System.Timers.Timer theTimer;

在表单加载时(或您需要开始更新轮询的任何其他时间),请执行以下操作:

theTimer = new System.Timers.Timer(1800000);
theTimer.Elapsed += PollUpdates;
theTimer.Start();

像这样声明 PollUpdates 成员函数:

private void PollUpdates(object sender, EventArgs e)
{
}
于 2013-04-08T12:59:47.823 回答
9

我认为您需要了解所有计时器类。请参阅下面乔恩的回答。

你用的是什么定时器?

  1. System.Windows.Forms.Timer 将在 UI 线程中执行
  2. System.Timers.Timer 在线程池线程中执行,除非您指定 SynchronizingObject
  3. System.Threading.Timer 在线程池线程中执行其回调

在所有情况下,计时器本身都是异步的——它在触发之前不会“占用”线程。

资料来源:.NET 计时器是否异步运行?

于 2013-04-08T12:54:33.067 回答