Я читал статьи о Dispatcher в WPF, но ни одна из них не очень хорошо объясняла поведение Dispatcher. Итак, мой вопрос к вам, ребята, что именно делает Dispatcher, кроме хранения очереди задач и выполнения их в соответствии с их приоритетами? Как выглядит очередь? Если я поставлю последовательно 3 задачи с приоритетом "нормальный", а потом одну задачу с приоритетом "отправить". Что будет выполнено первым? В каком порядке будут выполняться 3 задачи с обычным приоритетом? Есть ли какой-нибудь действительно хороший учебник по Dispatcher или какое-то доказательство концепций, которыми вы, ребята, хотели бы поделиться?
Дилемма диспетчера - как правильно отправить?
Ответы (1)
Dispatcher
фактически является просто насосом сообщений для приложений WPF.
В отличие от традиционного потока сообщений Windows, он имеет встроенный приоритет, поэтому действует как очередь с приоритетом вместо традиционной очереди (первым пришел, первым вышел).
Если вы отправляете сообщение с приоритетом Send
, оно будет обработано раньше других операций с другими приоритетами, например Normal
. Вы можете увидеть список приоритетов, а также их значения в DispatcherPriority
помощь. Сообщения с более высоким приоритетом всегда обрабатываются раньше сообщений с более низким приоритетом (которые еще не обрабатываются).
Что касается ваших конкретных вопросов:
Итак, мой вопрос к вам, ребята, что именно делает Dispatcher, кроме хранения очереди задач и выполнения их в соответствии с их приоритетами?
Он обрабатывает сообщения Windows и обрабатывает их точно так же, как обычный насос сообщений Windows в традиционном приложении Win32 или Windows Forms. Очередь с приоритетом создается для обработки пользовательских сообщений в дополнение к стандартным сообщениям Windows со встроенным приоритетом.
Как выглядит очередь?
Фактически это приоритетная очередь.
Если я поставлю последовательно 3 задачи с приоритетом "нормальный", а потом одну задачу с приоритетом "отправить". Что будет выполнено первым?
Это зависит. Если в это время выполняется другая работа, задача Send
будет выполняться первой. Если никакой другой работы не происходит, задача Normal
может быть выполнена до того, как вы отправите задачу Send
, и в этом случае порядок изменится. Однако задача Send
будет выполнена как можно скорее.
В каком порядке будут выполняться 3 задачи с обычным приоритетом?
Они будут выполняться в том же порядке, в котором они отправляются.
ContextLayoutManager
- это внутренний класс, используемый для решения проблем с макетом. Если вы отправите InvalidateMeasure()
, оно станет недействительным только в этой задаче — фактическое сообщение об измерении произойдет позже.
- person Reed Copsey; 05.03.2013