|
|
|
Синхронизация Модели с UI потоком09.01.2024, 12:06. Показов 2471. Ответов 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 | |
|
Помогаю со студенческими работами здесь
40
При выборе из Ad модели выбрать по кол-ву в связанной модели ad_images Выбор в таблице данных модели ссылки на экземпляр связанной модели
Как использовать представление одной модели в представлении другой модели? Скрыть все 3д модели или их части что находятся за границами другой модели Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|