每隔几秒重复一次功能

时间:2012-07-02 15:41:53

标签: c# .net loops

我想从程序打开的那一刻开始重复一个功能,直到它每隔几秒钟关闭一次。 在C#中执行此操作的最佳方法是什么?

4 个答案:

答案 0 :(得分:75)

使用计时器。有3种基本类型,每种都适合不同的目的。

仅在Windows窗体应用程序中使用。此计时器作为消息循环的一部分进行处理,因此计时器可以在高负载下冻结。

当您需要同步时,请使用此功能。这意味着tick事件将在启动计时器的线程上运行,允许您轻松执行GUI操作。

这是最强大的计时器,可以在后台线程上触发刻度线。这使您可以在后台执行操作,而不会冻结GUI或主线程。

对于大多数情况,我推荐System.Timers.Timer。

答案 1 :(得分:41)

为此,System.Timers.Timer效果最佳

// Create a timer
myTimer = new System.Timers.Timer();
// Tell the timer what to do when it elapses
myTimer.Elapsed += new ElapsedEventHandler(myEvent);
// Set it to go off every five seconds
myTimer.Interval = 5000;
// And start it        
myTimer.Enabled = true;

// Implement a call with the right signature for events going off
private void myEvent(object source, ElapsedEventArgs e) { }

有关详细信息,请参阅Timer Class (.NET 4.6 and 4.5)

答案 2 :(得分:11)

使用timer。请记住,.NET附带了许多不同的计时器。 This article涵盖了差异。

答案 3 :(得分:2)

.NET BCL中有很多不同的计时器:

何时使用哪个?

  • System.Timers.Timer,它会定期触发一个事件并在一个或多个事件接收器中执行代码。该类旨在在多线程环境中用作基于服务器或服务的组件。它没有用户界面,并且在运行时不可见。
  • System.Threading.Timer,它定期在线程池线程上执行一个回调方法。回调方法是在实例化计时器且无法更改时定义的。与System.Timers.Timer类类似,该类旨在用作多线程环境中的基于服务器或服务的组件。它没有用户界面,并且在运行时不可见。
  • System.Windows.Forms.Timer(仅.NET Framework),这是一个Windows Forms组件,它会定期触发一个事件并在一个或多个事件接收器中执行代码。该组件没有用户界面,并且设计用于单线程环境。它在UI线程上执行。
  • System.Web.UI.Timer(仅.NET Framework),一个ASP.NET组件,该组件定期执行异步或同步网页回发。
  • System.Windows.Threading.DispatcherTimer,已集成到Dispatcher队列中的计时器。在指定的时间间隔内以指定的优先级处理此计时器。

Source


其中一些需要显式Start调用才能开始滴答(例如System.TimersSystem.Windows.Forms)。还有一个明确的Stop才能完成滴答声。

using TimersTimer = System.Timers.Timer;

static void Main(string[] args)
{
    var timer = new TimersTimer(1000);
    timer.Elapsed += (s, e) => Console.WriteLine("Beep");
    Thread.Sleep(1000); //1 second delay
    timer.Start();
    Console.ReadLine();
    timer.Stop();

}

另一方面,有些计时器(例如:System.Threading)不需要显式的StartStop调用。 (提供的委托将运行一个后台线程。)您的计时器将计时直到您或运行时处置它为止。

因此,以下两个版本将以相同的方式工作:

using ThreadingTimer = System.Threading.Timer;

static void Main(string[] args)
{
    var timer = new ThreadingTimer(_ => Console.WriteLine("Beep"), null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
    Console.ReadLine();
}
using ThreadingTimer = System.Threading.Timer;
static void Main(string[] args)
{
    StartTimer();
    Console.ReadLine();
}

static void StartTimer()
{
    var timer = new ThreadingTimer(_ => Console.WriteLine("Beep"), null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
}

但是,如果您的timer被处置,它将明显停止跳动。

using ThreadingTimer = System.Threading.Timer; 

static void Main(string[] args)
{
    StartTimer();
    GC.Collect(0);
    Console.ReadLine();
}

static void StartTimer()
{
    var timer = new ThreadingTimer(_ => Console.WriteLine("Beep"), null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
}