【发布时间】: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