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的同一线程上执行?

DispatcherTimer.Start()在后台线程中启动Tick

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线程上执行!