在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有什么好处吗?

在c#中创建一个带有while(true)循环的线程比使用计时器更好吗?

由于各种原因,有比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/awaitContinueWith方法而不是Thread.Sleep方法进行延迟。

No。绝对没有理由使用第二个方法。