DispatcherTimer.Start()在后台线程中启动Tick
本文关键字:线程 启动 Tick 后台 Start DispatcherTimer | 更新日期: 2023-09-27 18:08:45
DispatcherTimer
是否启动新线程?
// DispatcherTimer setup
dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Interval = new TimeSpan(0,0,1);
dispatcherTimer.Start();
那么在这个代码示例中,Tick
(即EventHandler
)是在不同的线程上执行还是在设置dispatcherTimer
的同一线程上执行?
Tick
事件处理程序总是在拥有DispatcherTimer
对象的线程中引发。使用计时器类的正常方法是在UI线程中创建对象,然后在UI线程中引发事件处理程序。
但是就你关于这是如何发生的以及DispatcherTimer
是否启动一个新线程的问题而言…
计时器的确切实现只是一个实现细节。框架可以使用后台线程来计时,也可以使用其他机制。
碰巧的是,DispatcherTimer
的当前实现使用了原生WM_TIMER
机制(即不,它不会启动一个新线程)。这是有意义的,因为DispatcherTimer
的一个特性是在调度线程上引发定时器事件,而一种方便的方法是在同一线程中使用来自Windows的定时器通知,WM_TIMER
就是这样做的。
但是你不能也不应该假设是这样。您真正知道的是DispatcherTimer
承诺在分派器线程中引发定时器事件。
Start()
方法都必须是非阻塞的。如果该方法调用被阻塞,那么首先就会抵消使用计时器的所有好处。:) 还值得注意:有两个DispatcherTimer
类!
第一个是System.Windows.Threading.DispatcherTimer
。这就是我问题中的类。正如被接受的答案所解释的那样,Tick
将在同一个线程上执行。
第二个是Windows.UI.Xaml.DispatcherTimer
。在这个类的文档中说:
DispatcherTimer可用于在产生UI线程的同一线程上运行代码。在此线程上运行的代码具有创建和修改只能在UI线程上创建和修改的对象的特权。
所以Windows.UI.Xaml.DispatcherTimer
将被设置在一个UI线程上,它的Tick
也将在一个UI线程上执行!