И BeginInvoke
, и Invoke
в итоге вызовут внутренний метод с именем BeginInvokeImpl
для выполнения работы.Разница в том, что Invoke
затем ждет завершения операции перед возвратом.
И есть еще одно отличие: если вы уже находитесь в потоке пользовательского интерфейса и , вы используете DispatcherPriority.Send
Invoke
будет фактически вызывать метод напрямую, не проходя через BeginInvokeImpl
, что означает, что операция обрабатывается без прохождения через очередь сообщений.(Если вы не используете Send
, то любые другие сообщения, уже поставленные в очередь с более высоким свойством, чем ваша операция, будут обработаны первыми.)
Но так как вы, вероятно, не находитесь в потоке пользовательского интерфейса здесь - вы 'на некоторый обратный вызов WCF - этот особый случай не будет применяться.Таким образом, Invoke
в итоге вызывает ту же базовую реализацию, что и BeginInvoke
.
Из предоставленной вами информации, я должен был бы догадаться, что где-то здесь отсутствует деталь.Код, который вы показали, должен работать нормально, если, возможно, у вас нет нескольких потоков пользовательского интерфейса в вашем приложении, и страница, которая оказывается в CurrentPage
, время от времени принадлежит различным потокам.
Если вы делаетеЕсли у вас несколько потоков пользовательского интерфейса, то подход, который вы используете - проталкивание всего через диспетчер текущего объекта Application
, не сработает, потому что у вас будет несколько диспетчеров.Вам нужно получить правильный диспетчер для любого элемента пользовательского интерфейса, к которому вы планируете прикасаться.
Кстати, один из способов, которым вы можете случайно получить несколько потоков пользовательского интерфейса, - это создание объекта пользовательского интерфейса (например, страницы).) в каком-то рабочем потоке или обратном вызове.Возможно ли, что вы это где-то сделали?