【问题标题】:winform will Timer.timer create an new thread?winform Timer.timer 会创建一个新线程吗?
【发布时间】:2020-04-07 10:57:12
【问题描述】:

我想知道 System.timer.timer 是否会创建一个新线程并在其上运行。据我观察,当我在程序上运行调试模式时,timer1_Elapsed 仍在主线程上运行。谁能帮我解决这个问题?

【问题讨论】:

  • Winforms 计时器在 UI 线程上运行。 System.Timers.Timer 在可用的 ThreadPool 线程上运行。
  • @Charles,嗨,我是 C# 新手,可用的 ThreadPool 线程是什么意思?我正在使用 Timers.Timer,但它在主线程上运行。而且我还有一个应该在 UI 线程上运行的 Form.Timer,但是在调试模式下,我仍然发现它在主线程上运行。你能给我解释一下吗?
  • 欢迎来到定时器地狱。这是一个旧的:*.com/questions/10317088/… |但我最后的数是7-ish? |有些人总是启动一个新线程,有些人从不启动一个新线程,有些人有时只启动一个 - 它因版本而异。 abhisheksur.com/2011/03/all-about-net-timers-comparison.html
  • 在 Windows 窗体中,您通常使用 WinForms 计时器。即使在事件队列中它也会引发 Tick,因此跨线程问题不大。但是,它没有节拍器的质量。 |这真的取决于你打算做什么,一个你打算做什么元素,你打算多久做一次,第二精度有多重要,等等。
  • 线程池是一个线程池,根据需要创建和重用线程。您可以使用ThreadPool.GetMinThreads 之类的函数来获取一些信息。像这样的函数:Task.Factory.StartNew, Parallel.For, Task.Run, System.Timers.Timer, ThreadPool.QueueUserWorkItem 自动使用线程池线程。线程池使多线程更容易一些,因为您不再需要手动创建和管理线程。如果您有更多可用的 CPU 内核,线程池将创建更多线程,因此您的程序会在更强大的 PC 上自动扩展。

标签: c# multithreading timer


【解决方案1】:

.NET 中有 很多 定时器。 IIRC 在过去十年中跨越了六个,现在接近十几个。如果你包括像 StopWatches、Thread/Task.Delay 之类的东西,我们已经打破了十几个。即使没有它,我们也可能已经打破了十二个 - 很难保持当前的列表。

根据this article,System.Timers.Timer 使用ThreadPool。线程池实际上只是管理creation and reusing of Threads 以处理各种任务的自动方式。

但是,通常您希望避免使用多线程。使用 GUI,这会让你一头扎进CrossThreadExceptions and the need to invoke

我发现区分多任务和多线程很重要。多任务处理是伞形术语。仅当 CPU 负载很重时才需要多线程,例如计算。然而在很长一段时间里,多线程只是实现多任务的最快、最低代码的方式。这种情况最近发生了变化,因为我们现在有了 Async 和 Await 之类的东西,可以以非常低的代码占用量进行无线程多任务处理。

【讨论】: