Дилемма диспетчера - как правильно отправить?

Я читал статьи о Dispatcher в WPF, но ни одна из них не очень хорошо объясняла поведение Dispatcher. Итак, мой вопрос к вам, ребята, что именно делает Dispatcher, кроме хранения очереди задач и выполнения их в соответствии с их приоритетами? Как выглядит очередь? Если я поставлю последовательно 3 задачи с приоритетом "нормальный", а потом одну задачу с приоритетом "отправить". Что будет выполнено первым? В каком порядке будут выполняться 3 задачи с обычным приоритетом? Есть ли какой-нибудь действительно хороший учебник по Dispatcher или какое-то доказательство концепций, которыми вы, ребята, хотели бы поделиться?


wpf
person snowy hedgehog    schedule 05.03.2013    source источник


Ответы (1)


Dispatcher фактически является просто насосом сообщений для приложений WPF.

В отличие от традиционного потока сообщений Windows, он имеет встроенный приоритет, поэтому действует как очередь с приоритетом вместо традиционной очереди (первым пришел, первым вышел).

Если вы отправляете сообщение с приоритетом Send, оно будет обработано раньше других операций с другими приоритетами, например Normal. Вы можете увидеть список приоритетов, а также их значения в DispatcherPriority помощь. Сообщения с более высоким приоритетом всегда обрабатываются раньше сообщений с более низким приоритетом (которые еще не обрабатываются).

Что касается ваших конкретных вопросов:

Итак, мой вопрос к вам, ребята, что именно делает Dispatcher, кроме хранения очереди задач и выполнения их в соответствии с их приоритетами?

Он обрабатывает сообщения Windows и обрабатывает их точно так же, как обычный насос сообщений Windows в традиционном приложении Win32 или Windows Forms. Очередь с приоритетом создается для обработки пользовательских сообщений в дополнение к стандартным сообщениям Windows со встроенным приоритетом.

Как выглядит очередь?

Фактически это приоритетная очередь.

Если я поставлю последовательно 3 задачи с приоритетом "нормальный", а потом одну задачу с приоритетом "отправить". Что будет выполнено первым?

Это зависит. Если в это время выполняется другая работа, задача Send будет выполняться первой. Если никакой другой работы не происходит, задача Normal может быть выполнена до того, как вы отправите задачу Send, и в этом случае порядок изменится. Однако задача Send будет выполнена как можно скорее.

В каком порядке будут выполняться 3 задачи с обычным приоритетом?

Они будут выполняться в том же порядке, в котором они отправляются.

person Reed Copsey    schedule 05.03.2013
comment
Спасибо, Рид Копси. У меня к вам еще один вопрос. Что такое ContextLayoutManager. Кажется, это что-то вроде диспетчера или чего-то еще, использующего Dispatcher в WPF. Более того, если я вызываю Dispatcher для BeginInvoke(..) метод с нормальным приоритетом, и этот метод будет this.InvalidateMeasure(). Будет ли выполняться только InvalidateMeasure(), который, кроме того, устанавливает грязный флаг измерения в значение true, без фактического измерения(), или InvalidateMeasure() и Measure() будут объединены в одну и ту же задачу и будут выполняться вместе с обычным приоритетом? - person snowy hedgehog; 05.03.2013
comment
@hedgehog - Это слишком много для комментария (действительно совершенно новые вопросы) - ContextLayoutManager - это внутренний класс, используемый для решения проблем с макетом. Если вы отправите InvalidateMeasure(), оно станет недействительным только в этой задаче — фактическое сообщение об измерении произойдет позже. - person Reed Copsey; 05.03.2013
comment
Я проверил это. Кажется, InvalidateMeasure() и Measure() будут объединены в один и выполняться вместе. Я не знаю, почему это так. Кроме того, я хотел бы открыть новый чат для обсуждения ContextLayoutManager, просто я не знаю, как создать новый канал чата. - person snowy hedgehog; 05.03.2013
comment
@hedgehog Вы должны просто задать свой вопрос об этом как новый вопрос (и закрыть этот). Вызов Measure должен происходить сразу после вызова InvalidateMeasure, поэтому он может показаться совместным, но в отправленной операции будет выполнен только ваш код. - person Reed Copsey; 05.03.2013
comment
Интересно, потому что я сделал демо-пример, в котором я нахожусь внутри переопределения измерения совершенно другого элемента управления и вызываю внутри Dispatcher.BeginInvoke InvalidateMeasure другого элемента управления. Другая контрольная мера выполняется автоматически и крадет первую контрольную меру. Это сбивает с толку. Да, я закрыл этот вопрос и хотел бы открыть чат вместо нового вопроса, чтобы поговорить об измерениях в wpf. Как создать новое событие чата? - person snowy hedgehog; 05.03.2013
comment
Кажется, мне нужны какие-то привилегии для создания нового чата. Печальный :-( - person snowy hedgehog; 05.03.2013