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

时间:2015-04-21 15:01:24

标签: .net wpf winforms invoke begininvoke

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

我理解可以要求Control.Invoke()Dispatcher.Invoke()之间存在类比问题。

1 个答案:

答案 0 :(得分:1)

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:)