Изменение объектов GUI через SynchronizationContext

249
01 ноября 2017, 00:29

Почему возможно изменить объекты формы (свойства объектов: button.Caption = "") только через SynchronizationContext (т.е. из потока, в котором они создались)?

В чем заключается плюс такого архитектурного решения?

Answer 1

Дело в том, что графическая часть приложения обычно очень сложна. Представьте, например, сложность одного только layout manager'а: ему нужно обходить много раз тысячи объектов, чтобы расставить их по местам. Или код, который находит адресата сообщения от мыши, учитывая hit testing и возможные пользовательские callback'и.

Если сделать эту часть многопоточной, то сложность реализации возрастает на порядки. Кроме того, весь клиентский код должен быть дисциплинирован и применять нужные блокировки в правильный момент. Пример: изменение button.Caption может привести к изменению автоширины этого самого button'а, что в свою очередь может привести к изменению ширины вышестоящих элементов вплоть до окна. Это означает, что в процессе присвоения либо необходимо блокировать всё окно при помощи mutex'а (иначе в двух потоках могут пробегать одновременно два встречных процесса layout management'а с катастрофическими последствиями), либо откладывать обработку на более позднее время (на следующую итерацию оконного цикла).

Второй вариант концептуально намного сложнее, т. к. при этом установка свойств будет происходить не сразу, а позже, то есть, установив ширину контрола и тут же считав её, вы получите не то значение, которое записали. Это не то поведение, которое обычно ожидают от свойств.

А первый вариант (полная блокировка окна) означает, что все операции всё равно сериализованы, то есть, идут не параллельно, а строго одна за одной. Это не даёт никаких потенциальных выгод по сравнению с однопоточным UI (но лишь добавляет сложность для «клиентов» фреймворка).

Именно поэтому почти все UI-фреймворки однопоточны.

Мне приходилось по работе писать многопоточный UI-фреймворк. Поверьте, это не стоит того.

READ ALSO
Дописать текст в конец файла

Дописать текст в конец файла

Как дописать данные построчно из 1txt в конец 2

371
C# Чтение и запись потока в одном классе

C# Чтение и запись потока в одном классе

Есть ли вnet класс, который может делать и чтении и запись данных в файл?

246
Как выбрать нужный элемент через js

Как выбрать нужный элемент через js

Делаю парсерЕсть список на сайте

274
Что означает eslint-disable-next-line?

Что означает eslint-disable-next-line?

Потребовалось подключить библиотеку Mansonry в jsСогласно документации, нужно создать объект

342