2015-04-21 5 views
1

Недавно я использовал метод Control.BeginInvoke(), чтобы поместить вызов метода в очередь для вызова в потоке пользовательского интерфейса позже. Я также знаю, что есть метод Dispatcher.BeginInvoke(). Я прочитал некоторые общие ресурсы (like this on CodeProject) и все еще вопрос о том, отличается ли поведение Control.BeginInvoke() от Dispatcher.BeginInvoke() или нет.В чем разница между Control.BeginInvoke() и Dispatcher.BeginInvoke()?

Я понимаю, что аналогичный вопрос можно задать для разницы между Control.Invoke() и Dispatcher.Invoke().

+1

Нет никакой разницы. Используйте Control.BeginInvoke() в приложении Winforms, Dispatcher.BeginInvoke() в приложении WPF или Modern UI. Не смешивайте. –

+0

Благодарим вас за разъяснение Ганса. Если вы передадите этот комментарий в ответ, я соглашусь с ним. – miroxlav

ответ

1

Control.BeginInvoke существует с первых дней работы .NET (по крайней мере, версия 1.1). Это очень естественная подгонка, если у вас есть контроль и вы хотите что-то запускать в его потоке пользовательского интерфейса (может быть several UI threads). Однако, если вы хотите запустить что-то общее в потоке пользовательского интерфейса и не имеете соответствующего Control, хакерским решением было создать Control, который не отображается в пользовательском интерфейсе, а затем Invoke.

В .NET 3 (IIRC) Dispatcher был добавлен для решения этой проблемы.

Короче:

  • Если у вас есть Control под рукой вы можете использовать Control.BeginInvoke
  • Если у вас нет соответствующего контроля, создать Dispatcher (заранее) и использовать Dispatcher.BeginInvoke
  • Если вы находитесь в далеком прошлом, у вас нет выбора, кроме как использовать Control.BeginInvoke :)
Смежные вопросы