C#面试题更新 2026-08-05

请解释 WPF 中 Dispatcher 对象的作用,并描述在 UI 线程上执行代码的机制。

技术原理C#WPF

考察说明

考察对 WPF 线程模型和 Dispatcher 调度的理解。

回答思路

  1. 【回答框架 1】Dispatcher 是 WPF 中负责管理 UI 线程工作项的调度器,它维护一个消息循环,将来自各个线程的方法调用封送到 UI 线程上执行。每个 UI 线程都有一个对应的 Dispatcher,通过依赖属性或静态 Dispatcher.CurrentDispatcher 获取。
  2. 【回答框架 2】在 UI 线程上执行代码,通常使用 Dispatcher.BeginInvoke 或 Invoke 方法。BeginInvoke 是异步调用,不会阻塞调用线程;Invoke 是同步调用,会等待执行完成。它们接收一个委托,也可以指定优先级。
  3. 【回答框架 3】后台线程更新 UI 时,必须通过 Dispatcher 封送,否则会抛出异常或导致不可预期的行为。
  4. 【回答框架 4】除了 Dispatcher.Invoke,还可以使用 Task 和 async/await 模式,通过 SynchronizationContext 或 TaskScheduler 自动封送回 UI 线程。在 WPF 中,await 会捕获当前的 SynchronizationContext,并在继续时自动调用 Dispatcher。
  5. 【回答框架 5】Dispatcher 的优先级影响执行顺序,比如 Background 优先级较低,Render 优先级较高。使用 Dispatcher 可以确保 UI 响应性,但要注意避免阻塞和死锁。
  6. 【关键点 1】Dispatcher 是 WPF 的消息循环调度器,用于将任务封送到 UI 线程。
  7. 【关键点 2】Invoke 同步执行,BeginInvoke 异步执行。
  8. 【关键点 3】后台线程更新 UI 必须通过 Dispatcher。
  9. 【关键点 4】async/await 自动通过 SynchronizationContext 封送。
  10. 【关键点 5】Dispatcher 优先级影响任务调度。
  11. 【易错点 1】不要使用 Dispatcher.Invoke 在 UI 线程同步等待耗时操作,以免卡死 UI。
  12. 【易错点 2】避免在非 UI 线程直接访问 UI 控件,应通过 Dispatcher 封送。
  13. 【易错点 3】注意 Dispatcher 的优先级设置不当可能导致任务饿死。