Control.BeginInvoke() 和 Dispatcher.BeginInvoke() 有什么区别?

What is difference between Control.BeginInvoke() and Dispatcher.BeginInvoke()?

最近我使用 Control.BeginInvoke() 方法将方法调用放入队列,稍后在 UI 线程上调用。我也知道有 Dispatcher.BeginInvoke() 方法。我阅读了一些一般资源 (like this on CodeProject),但仍有疑问 Control.BeginInvoke() 的行为是否与 Dispatcher.BeginInvoke() 不同。

我明白了 Control.Invoke()Dispatcher.Invoke() 之间的区别可以问类比问题。

Control.BeginInvoke 存在于 .NET 的早期(至少版本 1.1)。如果您有一个控件并希望在其 UI 线程上 运行 某些内容(可以有 several UI threads),那么这是一个非常自然的选择。但是,如果您想在 UI 线程上 运行 一些通用的东西,并且没有合适的 Control,那么 hacky 解决方案是创建一个 Control,它不会出现在UI 然后是 Invoke

在 .NET 3 (IIRC) 中添加了 Dispatcher 来解决这个问题。

简而言之:

  • 如果您手边有Control,您可以使用Control.BeginInvoke
  • 如果您没有合适的控件,请创建一个 Dispatcher(提前)并使用 Dispatcher.BeginInvoke
  • 如果你在遥远的过去,你别无选择,只能使用 Control.BeginInvoke :)