在c#中创建一个带有while(true)循环的线程比使用计时器更好吗?
本文关键字:线程 计时器 更好 循环 while 创建 一个 true | 更新日期: 2023-09-27 18:05:08
我知道c#允许使用定时器:
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 1000/60;
timer.Tick += new EventHandler(TimerEventProcessor);
timer.Start();
private static void TimerEventProcessor(Object myObject, EventArgs myEventArgs)
{
//Do something
}
但是,我在这个YouTube教程中看到,他们没有使用Timer
,而是创建了一个线程,实现了自己的计时器:
var task = new Task(Run());
task.start();
protected void run ()
{
while (true)
{
Thread.sleep(1000/60);
//Do something
}
}
使用第二种方法比使用更简单的Timer
有什么好处吗?
由于各种原因,有比System.Windows.Forms.Timer
更好的计时方法,但没有一个包括您自己的线程管理(这是浪费资源,因为每个线程都有大量的内存开销)。
比较。net框架类库中的定时器类
下面是文章底部的表格:
+---------------------------------------+----------------------+---------------------+------------------+
| | System.Windows.Forms | System.Timers | System.Threading |
+---------------------------------------+----------------------+---------------------+------------------+
| Timer event runs on what thread? | UI thread | UI or worker thread | Worker thread |
| Instances are thread safe? | No | Yes | No |
| Familiar/intuitive object model? | Yes | Yes | No |
| Requires Windows Forms? | Yes | No | No |
| Metronome-quality beat? | No | Yes* | Yes* |
| Timer event supports state object? | No | No | Yes |
| Initial timer event can be scheduled? | No | No | Yes |
| Class supports inheritance? | Yes | Yes | No |
+---------------------------------------+----------------------+---------------------+------------------+
* Depending on the availability of system resources (for example, worker threads)
虽然这两种计时方法都不精确,但是第一种方法更精确一些:考虑使用//Do something
标记的代码占用100 ms的情况。那么//Do something
调用之间的间隔将是1000/60+100
,而不是您期望的1000/60
。
在提供计时器的平台上,我总是建议您使用计时器,因为它们可能比Thread.sleep
实现得更有效。问题是sleep
完全阻塞了线程,只是为了通知另一个线程而浪费了整个线程。
另一方面,计时器可以管理多个时间,并且只使用一个线程。它甚至可以使用操作系统提供的一些额外功能。但不仅如此,它甚至可能考虑到一些调度成本,以更精确(至少理论上)。
唯一可能的好处可能是卸载到后台线程。在您的示例中,计时器的事件处理程序将在ui线程上运行,而后者将在后台线程上运行。
我将使用Task。使用async/await
或ContinueWith
方法而不是Thread.Sleep
方法进行延迟。
No。绝对没有理由使用第二个方法。