我想从程序打开的那一刻开始重复一个功能,直到它每隔几秒钟关闭一次。 在C#中执行此操作的最佳方法是什么?
答案 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队列中的计时器。在指定的时间间隔内以指定的优先级处理此计时器。其中一些需要显式Start
调用才能开始滴答(例如System.Timers
,System.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
)不需要显式的Start
和Stop
调用。 (提供的委托将运行一个后台线程。)您的计时器将计时直到您或运行时处置它为止。
因此,以下两个版本将以相同的方式工作:
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));
}