Вызов потока пользовательского интерфейса из рабочего потока обсуждался много раз, и мы знаем, почему следует использовать BeginInvoke () вместо Invoke (). Недавно я опубликовал этот вопрос и после некоторых исследований я обнаружил, что существует как минимум три различных способа (внутренне они могут быть одинаковыми) для вызова (асинхронно) чего-либо в потоке пользовательского интерфейса.
Control.BeginInvoke()
- Использование
SynchronizatoinContext
Класс
- Использование
Dispatcher.BeginInvoke(priority.. )
Может кто-нибудь сказать мне, какой НАДЕЖНЫЙ способ асинхронно вызывать метод, который будет выполняться в потоке пользовательского интерфейса. Есть опыт? Я вижу, что Dispatcher.BeginInvoke имеет приоритетный компонент, делает его более надежным?
Контекст
мы используем someControl.BeginInvoke()
, но заметили, что иногда (к сожалению, только в рабочей среде конечного пользователя) делегат переходит к BeginInvoke is
, никогда не выполняющемуся, что заставляет меня поверить, что создаваемое им почтовое сообщение теряется. Нам нужен надежный способ связи с потоком пользовательского интерфейса. control.Invoke()
иногда вывешивают пользовательский интерфейс, поэтому мы тоже не хотим туда заходить.