Вызов PushFrame в одном и том же диспетчере из разных потоков просто не имеет смысла, вы не написали, какую проблему пытаетесь решить, но ваше решение на основе PushFrame, вероятно, неверно.
Объект Dispatcher отвечает за выполнение кода и отправку события для одного потока, каждый поток имеет очередь сообщений, которые отправляются ОС и включают уведомления о таких вещах, как щелчки мыши, диспетчер имеет цикл, который считывает эту очередь и вызывает соответствующее событие.
Иногда вам приходится обрабатывать сообщения, не возвращаясь из вашего метода в цикл диспетчера, хорошим примером для этого являются модальные диалоги, которые реагируют на пользовательский ввод (поэтому им необходимо обрабатывать сообщения), не прерывая поток управления метода, который их вызвал.
Это то, что делает PushFrame — он запускает цикл диспетчера внутри вашего кода.
Каждый поток (необязательно) имеет свою собственную очередь сообщений, сообщения специфичны для окон и элементов управления, принадлежащих этому потоку, вы не можете обрабатывать очередь сообщений потока из другого потока (сама Windows не имеет API, позволяющего вам читать сообщения в другой теме).
Вызов PushFrame из другого потока не может работать, потому что ваш вызов происходит в неправильном потоке, сам PushFrame должен вызываться в том же потоке, которым управляет диспетчер, вы не можете вызывать его в другом потоке, потому что он пытается обработать сообщения потока в другом потоке.
Использование Invoke или BeginInvoke здесь также не имеет смысла, потому что делегат, переданный этим методам, вызывается только тогда, когда диспетчер обрабатывает сообщения, если диспетчер уже обрабатывает сообщения, нет необходимости вызывать PushFrame, чтобы заставить его обрабатывать сообщения.
Если вы зададите другой вопрос, описывающий, что вы пытаетесь сделать, кто-то здесь может вам помочь, но вызов Dispatcher.PushFrame из разных потоков никогда не сработает.
person
Nir
schedule
19.04.2010