创建一个异步运行的后台计时器

本文关键字:运行 后台 计时器 异步 一个 创建 | 更新日期: 2023-09-27 18:08:16

我真的很纠结。我正在visual studio中创建一个winforms应用程序,需要一个每半小时滴答一次的背景计时器-这是为了从服务器上拉下更新。

我尝试了几种不同的方法,但他们都失败了,要么是由于糟糕的教程/例子,要么是我自己在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
}

与通常的警告:timer不会非常准确,可能需要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)
{
}

我认为你需要了解所有定时器类。请看下面Jon的回答。

你用的是哪种定时器?

  1. System.Windows.Forms。计时器将在UI线程
  2. 中执行。
  3. System.Timers。定时器在线程池线程中执行,除非您指定一个SynchronizingObject
  4. System.Threading。Timer在线程池线程
  5. 中执行回调。

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

来源:做。net定时器异步运行?