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
:)
最近我使用 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
:)