创建后台计时器以异步运行

时间:2013-04-08 12:48:37

标签: c# winforms asynchronous timer

我真的很挣扎。我正在visual studio中创建一个winforms应用程序,需要一个每半小时打一次的后台计时器 - 这样做的目的是从服务器下载更新。

我尝试了几种不同的方法,但是由于教程/示例不好或者C#中我自己的缺点,它们都失败了。我认为到目前为止,向我展示我所尝试的内容将是浪费时间,因为我认为我的尝试远远不够。

有没有人知道实现异步后台计时器的一种简单明了的方法,C#新手很容易理解?

3 个答案:

答案 0 :(得分:32)

    // 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)

另请参阅:Why does a System.Timers.Timer survive GC but not System.Threading.Timer?

答案 1 :(得分:10)

在表单中声明成员变量:

System.Timers.Timer theTimer;

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

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

声明你的PollUpdates成员函数如下:

private void PollUpdates(object sender, EventArgs e)
{
}

答案 2 :(得分:6)

我认为您需要了解所有计时器类。请参阅Jon的答案。

  

你使用什么样的计时器?

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

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

来源:Do .NET Timers Run Asynchronously?

相关问题