默认情况下,WPF 应用程序具有单线程 - 主 UI 线程和所有 UI 控件/窗口都被创建并与之关联。在这种情况下,我看不到使用多个 Dispatcher 和 Dispatcher Timer 的任何好处,因为无论如何 Dispatcher Timer 会将所有消息委托给关联的 Dispatcher 的消息循环,这将是主 UI 线程消息循环。
但是,如果您在单独的工作线程中创建了一些控件,例如
var thread = new Thread(() =>
{
CustomWindow wnd = new CustomWindow();
};
并且也会将消息发布到此窗口 - 然后创建一个新的 Dispatcher 并与手动创建的线程关联是有意义的,所以基本上每个 Dispatcher 都将与自己的线程关联,因此关系是 1 比 1。
关于 atick 方法 - 它将在与 Dispatcher 线程关联的线程上执行。如果您尚未创建与手动创建的工作线程关联的调度程序,那么默认情况下 WPF 调度程序与主 UI 线程关联,
MSDN:
使用 DispatcherTimer 而不是 System.Timers.Timer 的原因是 DispatcherTimer 与 Dispatcher 在同一线程上运行,并且可以在 DispatcherTimer 上设置 DispatcherPriority