|
|
|
Синхронизация Модели с UI потоком09.01.2024, 12:06. Показов 2802. Ответов 43
Метки нет (Все метки)
Тема создана разделением исходной: Как определить из кода библиотеки Standard платформу приложения (Forms, WPF, UWP, Framework, Core и т.д.)?
Немного нубский вопрос -- насколько плохо считается прокидывать Dispatcher в модель/команду? Я просто сейчас для себя пишу WPF приложуху, и для отслеживания изменения не из UI потока прям в модель запихиваю диспетчер из окна/контролера. Я так понимаю желательно максимально отвязывать от UI модели/команды, но не особо представляю как это сделать малой кровью.
0
|
|
| 09.01.2024, 12:06 | |
|
Ответы с готовыми решениями:
43
Модуль EVO II синхронизация 50гц, На какой ножке контроллера синхронизация шим двигателя?
Как создать скелет для stl модели по точкам поверхности модели? |
|
|
||
| 10.01.2024, 17:10 | ||
0
|
||
|
|
||
| 10.01.2024, 18:19 [ТС] | ||
|
Элд Хасп, писал по памяти. WPF, соотвественно CanExecuteChanged и PropertyChanged.
0
|
||
|
Модератор
|
|||
| 10.01.2024, 19:38 | |||
|
Там нужен маршалинг CollectionChanged. Добавлено через 3 минуты Если работа с коллекциями в разных потоках, то нужно обеспечить потокобезопасную работу с ними. А решение синхронизации с GUI - это незначительная часть этой потокобезопасности. Поэтому, лично я, считаю плохой практикой использование UI потока для этого. Только в каких-то крайних случаях и с пониманием, что это костыль.
0
|
|||
|
|
||
| 11.01.2024, 07:01 [ТС] | ||
|
0
|
||
|
Модератор
|
||
| 11.01.2024, 08:25 | ||
|
Все UI элементы должны создаваться в XAML (Content, Template, DataTemplate и пр.) и никаких "фабрик UI элементов" не нужно. Шаблоны это и есть их фабрики. Добавлено через 8 минут Для "стандартного" WPF (так же и для Форм) UI поток - это основной поток приложения и он не меняется всё время сеанса приложения. Поэтому все теоретические проблемы, о которых я писал выше, там не возникают. Иначе я бы давно создал реализацию с их учётом. Проблемы возникают, когда "отклоняются от стандарта": вызывают WPF окно из Форм; искусственно создают несколько корневых UI потоков (тех в которых открываются окна); многоплатформенные GUI-приложения и прочее. Так как нет чётко описания в документации связанности UI элементов с единственным потоком, то в теории возможно реализовать это как угодно. Вот учёт этого "как угодно" и вызывает проблемы. Насколько помню, только у Форм по документации Контекст Синхронизации связан с потоком 1 к 1.
0
|
||
|
|
||
| 11.01.2024, 08:49 | ||
|
Паттерн MVVM: 1. Model - бизнес-логика, слой работает сам по себе и не знает вообще ни о чём кроме себя самого и классов DTO. 2. ViewModel - слой для связи Model и View, знает только о Model и о классах DTO. 3. View - слой приложения с UI, в 90% случаев сделан совместно с Application, знает только про ViewModel и классы DTO. 4. Services - всякое вспомогательное нечто, которое через DI внедряется куда надо, не знает вообще ни о чём. 5. Application - связывает все слои вместе с помощью DI или ещё чего-нибудь, включает платформозависимые сервисы и т.д. Вот такая жесткая иерархия и должна быть у вас. Пункты 1, 2, 3 и 4 - разные проекты в одном решении. И тогда никакого проникновения логики вышестоящего слоя в нижестоящий не будет.
0
|
||
|
Модератор
|
||
| 11.01.2024, 09:20 | ||
System.ObjectModel.dll и относится к типам "общего применения". И то, что он дефолтный для Привязок в WPF не значит, что его применение следует ограничить на этом уровне. Но согласен, что на уровне Модели обычно удобнее применять другие интерфейсы, чаще с кастомными событиями.2) Использование в VM этого интерфейса не гарантирует, что его событие будет вызываться только в UI потоке. Скорее даже в типичной реализации это событие чаще будет вызываться асинхронно: Модель обновилась асинхронно -> подняла также асинхронно своё кастомное событие -> в этом же потоке VM обновляет своё состояние -> VM подымает асинхронно событие INPC. Добавлено через 2 минуты Это же относится и к событиям интерфейсов ICommand, INotifyCollectionChanged, IBindingList и, возможно, DataTable. Добавлено через 3 минуты Тот же INotifyCollectionChanged (ObservableCollection), например, используется в EF. А это уровень даже не Модели, а Репозитория.
1
|
||
|
|
|
| 11.01.2024, 09:21 | |
|
Wolfdp, И ещё по типам проектов, чтоб вообще всё по правильному было
![]() Пункты те же 1. NET Standard 2. В идеале или при использовании сторонних пакетов (ReactiveUI, CommunityToolkit) - NET Standard, если писать только под WPF, использование CommandManager (RelayCommand), то тип Библиотека NET с поддержкой PresentationFramework. Единственный используемый тип из этой библиотеки - CommandManager в реализации RelayCommand(). 3 + 5. Приложение WPF 4. NET Standard
0
|
|
|
|
||||||||||||||||||||||
| 11.01.2024, 10:34 [ТС] | ||||||||||||||||||||||
|
Сейчас накидал вот вообще по минимуму кода чтобы проверить что к чему -- вроде остается проблема с ICommand -- если команду создаю вне UI потока, то потом валится на CanExecuteChanged. Для команд таки придется прокидывать маршалинг (или как оно правильно называется)?
0
|
||||||||||||||||||||||
|
|
|
| 11.01.2024, 10:47 | |
|
Wolfdp, Попробуйте вот такую реализацию - MVVM - Going async with async command
0
|
|
|
|
|||
| 11.01.2024, 14:03 | |||
Wolfdp, На GitHub есть исходный код, там ни слова про сторонние библиотеки.
0
|
|||
|
Модератор
|
|||
| 11.01.2024, 15:02 | |||
|
Решать надо либо через захват контекста потоков слушателей - ссылку на мою реализацию я давал выше. Либо через маршалинг внутри View. Реализовать его можно разными способами. Но все они непросты...
0
|
|||
|
|
||||||
| 11.01.2024, 15:04 [ТС] | ||||||
|
Andrey-MSK, честно говоря не понял задума по IAsyncCommand -- просто пинается таска и по сути все. Более того, этот метод выглядит неправильным: мы меняем статус, выполняем задачу (т.е. дожидаемся завершения), опять меняем статус и только тогда пинаем ивент. По сути UI узнает об изменениях только после завершения.
0
|
||||||
| 11.01.2024, 15:12 [ТС] | |
|
0
|
|
|
Модератор
|
|||||||||||||||||||
| 11.01.2024, 15:28 | |||||||||||||||||||
|
Эти команды работают во всех стандартных приложениях: формы, WPF, UWP, Avalonia и др. В приложениях с "перекрёстными" платформами (например, из Форм вызывается WPF окно) - не тестировал. Сам базовый класс для событий можно использовать с любым типом событий: PropertyChanged, CollectionChanged и прочими. Добавлено через 1 минуту Команда должна инициализироваться передачей в неё одного или двух делегатов, а не Модели. Добавлено через 6 минут "Стандартная" простейшая реализация команд с МЕТАНИТ:
Нет жёсткой завязки именно на свою реализацию. Именно за это здесь и написано.
0
|
|||||||||||||||||||
| 11.01.2024, 15:32 [ТС] | |
|
Не по теме: Элд Хасп, я таки пожалуй отложу это в долгий ящик. Хочется собрать хотя бы относительно рабочий билд и занятся обработчиком сообщений, а не доводить до идеала UI. Может потом закину для модели интерфейс с методами, если вдруг таки надумаю писать тесты для всего этого.
0
|
|
| 11.01.2024, 15:32 | |
|
При выборе из Ad модели выбрать по кол-ву в связанной модели ad_images Выбор в таблице данных модели ссылки на экземпляр связанной модели
Как использовать представление одной модели в представлении другой модели? Скрыть все 3д модели или их части что находятся за границами другой модели Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2.
Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
|
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её.
Всё это стресс конечно. Почему?. . .
|
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот.
Ларри Уингет
|
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
|
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|