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