|
|
|
Синхронизация Модели с UI потоком09.01.2024, 12:06. Показов 2769. Ответов 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д модели или их части что находятся за границами другой модели Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча
Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове.
Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
|
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
|
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера»
Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит.
Придуман Биллом Госпером в 1970-х, опубликован в. . .
|
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb">
<style>
<!]>
</ style>
<g id="bush">
</ g>
</ svg>
function fn(){
let rost;/ / высота древа
let xx=165,yy=210,w=256;
|
|
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов,
содержащихся в реализации модуля. По-умолчанию все члены модуля доступны:
module Foo
let x = 10
let boo () = printfn "boo"
. . .
|
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible". . .
|
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов.
import "math"
func angleClock(hour int, minutes int) float64 {
. . .
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|