Форум программистов, компьютерный форум, киберфорум
C#: XAML
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
 Аватар для SuprSonic
7 / 4 / 3
Регистрация: 07.08.2016
Сообщений: 65
.NET Core

Асинхронность в Avalonia (MVVM)

16.09.2020, 18:46. Показов 7883. Ответов 25

Студворк — интернет-сервис помощи студентам
Кликните здесь для просмотра всего текста
Avalonia — кроссплатформенная платформа пользовательского интерфейса на основе XAML, основанная на WPF/UWP и распространяемая под лицензией MIT.


Приветствую всех,
Я про Avalonia слышал давно, но руки до пощупать дошли только сейчас, тем более это уже релизная версия. В общем, проблема в следующем — любая попытка инициализировать какую-то задачу в другом потоке приводит к зависанию интерфейса. Зависает наглухо где-то на 1.5 секунды и потом его отпускает, в принципе терпимо, но выглядет убого и если долго пользоваться таким приложением, то дело, вероятно, закончится нервным тиком.

Тут стоит прояснить, что дело разворачивается на MacOS (но вроде как такая же проблема и на Windows присутствует). У кого-нибудь, кто пользовался этим чудом кроссплатформенности была такая трабла?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.09.2020, 18:46
Ответы с готовыми решениями:

Avalonia
Приходилось ли кому работать с сабжем ? С WPF знаком не сильно. Но нужна кроссплатформенность. Собственно сабж это и позволяет, грубо...

Консоль .Net Core и Avalonia
Добрый день! Кто-нибудь пользовался связкой консоль .net core для описания модели данных + Avalonia в качестве UI? 1. Как оно?...

В чем принципиальное отличие Avalonia и Xamarin?
Скорее всего, данный вопрос возникал не только у меня (но подробную инфу не нашел). В чем собственно принципиальная разница между...

25
 Аватар для SuprSonic
7 / 4 / 3
Регистрация: 07.08.2016
Сообщений: 65
17.09.2020, 18:53  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А там же нигде не происходило изменения значения свойства Routed.
Ну в этом примере да, этого не происходило.

C#
1
2
private SearchViewModel searchViewModel = new SearchViewModel();
private LoginViewModel loginViewModel = new LoginViewModel();
Мне как то не по душе от этого. Потому что по сути происходит фоновое создание экземпляров всех вьюмоделей. Это не правильно, они должны создаваться в тот момент, когда они нужны. Именно поэтому, был использован этот способ:
C#
1
2
_search = ReactiveCommand.Create(
() => { Router.Navigate.Execute(new SearchViewModel()); });
Будет к примеру сотня, а то и больше вьюмоделей, создавать их сразу в основном вью — ну это очень не очень.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
17.09.2020, 19:22
Цитата Сообщение от SuprSonic Посмотреть сообщение
Т.е. контент самой MainView никогда не будет отображен в данном случае это:
А вы вариант из поста #11 попробовали?
У меня он чуть лагает (все кнопки), но вроде так должно решаться.
Возможно у вас будет гладко работать.
Загружать стек всё таки не правильно.

Добавлено через 2 минуты
Цитата Сообщение от SuprSonic Посмотреть сообщение
Будет к примеру сотня, а то и больше вьюмоделей, создавать их сразу в основном вью — ну это очень не очень.
Как это сотня разных типов.
Это одно из типовых, часто используемых решений.
Создаётся по ОДНОМУ экземпляру каждого типа.
А при переходе на нужный тип подгружаются в него нужные данные.

Добавлено через 1 минуту
Цитата Сообщение от SuprSonic Посмотреть сообщение
Именно поэтому, был использован этот способ:
Я не знаю Avalonia - надо смотреть исходники.
Но вариант при котором вызов асинхронного метода происходит в конструкторе, вполне возможно может приводить к лагам.
0
 Аватар для SuprSonic
7 / 4 / 3
Регистрация: 07.08.2016
Сообщений: 65
17.09.2020, 19:55  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А вы вариант из поста #11 попробовали?
В нем да, все ок. Дефолтный контент показывается.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это одно из типовых, часто используемых решений.
Ну такое себе решение, если честно. Потому что по факту вызов происходит не из самой вью в момент создания, а из абсолютно стороннего вью, в данном случае из LoginMethodAsync принадлежащий MainViewModel.
C#
1
2
3
4
5
        private async void LoginMethodAsync()
        {
            await Router.Navigate.Execute(loginViewModel);
            await loginViewModel.MethodAsync();
        }
Более того сам метод MethodAsync модели LoginViewModel публичный...

По идее MainViewModel ничего не должен знать о методах которые будут использоваться в других моделях. Ну это как-то странно если он будет знать все о всех.

Добавлено через 9 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не работает Дизайнер (Конструктор XAML) - все элементы в XAML подчёркнуты синим: "Отсутствует тип ..."
При запуске не работают "Динамический обозреватель свойств" и "Динамическое визуальное дерево".
Вот, кстати, XAML previewer and templates for the Avalonia UI framework. для Visual Studio
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
17.09.2020, 20:20
Цитата Сообщение от SuprSonic Посмотреть сообщение
Более того сам метод MethodAsync модели LoginViewModel публичный...
По идее MainViewModel ничего не должен знать о методах которые будут использоваться в других моделях. Ну это как-то странно если он будет знать все о всех.
Согласен.
Но чтобы дать ПРАВИЛЬНОЕ решение нужно разбираться в реактивной модели используемой Avalonia, причинах по которому GUI Avalonia лагает при использовании асинхронного метода в конструкторе ViewModel.

Для меня это пока тёмный лес...


Что касается создании при каждом нажатии на кнопку новой VM - это тоже неверно.
Если View должна отобразить те жи данные, то зачем для них создавать новый экземпляр VM.
Надо просто сослаться на уже существующий.


Я не знаю как этот делается в Avalonia, но в развитых фрамеворках для этого используется примерно такой метод
C#
1
object GetViewModel(Type typeViewModel, object Data) {}
Метод возвращает созданную по указанному типу VM с загруженными в неё данными.
Если она ранее создавалась, то возвращает её из пула.
Если нет - создаёт новый экземпляр и запоминает его в пуле.

Добавлено через 1 минуту
Цитата Сообщение от SuprSonic Посмотреть сообщение
Вот, кстати, XAML previewer and templates for the Avalonia UI framework. для Visual Studio
Я прочитал на сайте Avalonia как надо со Студией её испоьзовать.
Но для меня это не имеет смысла.

Смысл в ней - это возможность использования вне Windows.
А у меня только комп.

Добавлено через 13 минут
Цитата Сообщение от SuprSonic Посмотреть сообщение
По идее MainViewModel ничего не должен знать о методах которые будут использоваться в других моделях.
Да это так, но если считать все три окна View одного уровня (то есть они не должны знать друг о друге), то и реализация команды перехода при которой создаётся VM для других View тоже неверное решение.

Смотрите как у нас реализовано приложение по уровням:
  • App - знает обо всех. Может обращаться к типам любого уровня.
  • Основные View - не знают об App, знают о своей VM, о View и VM следующего уровня. О VM лругих View этого же уровня - не знают.
  • Дочерние и вложенные View - не знают о вышестоящих и одноранговых View и ViewModel. О нижестоящих знают.

Раз по вашей архитектуре все три View - это основные View, то они не должны знать друг о друге.
И кнопка не должна переключать на другую View, она должна посылать сообщение (или восходящую команду).
Его должен "поймать" App и переключить на другую View.
А в "полномочия" App входят любые манипуляции с любыми типами приложения.

Добавлено через 4 минуты
Так же, возможно, вы неверно воспринимаете архитектуру свое приложения.
Обратите внимание, что MainView - это окно.
А две остальные - это UserControl, которые которые в нём отображаются.
Тогда можно воспринимать их не как одноранговые с основным, а как вложенные в него (или дочерние).
И при таком подходе Main владеет о них информацией, в том числе и может обращаться к методам их VM.
1
 Аватар для SuprSonic
7 / 4 / 3
Регистрация: 07.08.2016
Сообщений: 65
17.09.2020, 23:33  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Только в соседней теме писал за инициализацию команд: Принудительное обновление UI для обновления кнопки по состоянию команды
А в чем толк таких преобразований?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class MainViewModel : ReactiveObject, IScreen
    {
//        private readonly ReactiveCommand<Unit, Unit> _search;
//        private readonly ReactiveCommand<Unit, Unit> _login;
        private RoutingState _router = new RoutingState();
 
        public MainViewModel()
        {
            Login = ReactiveCommand.Create(
                () => { Router.Navigate.Execute(new LoginViewModel()); });
 
            Search = ReactiveCommand.Create(
                () => { Router.Navigate.Execute(new SearchViewModel()); });
        }
        
        public RoutingState Router
        {
            get => _router;
            set => this.RaiseAndSetIfChanged(ref _router, value);
        }
 
//        public ICommand Search => _search;
//        public ICommand Login    => _login;
 
        public ReactiveCommand<Unit, Unit> Search {get;}
        public ReactiveCommand<Unit, Unit> Login   {get;}
    }
В моей реализации поля приватные и только для чтения:
C#
1
2
//        private readonly ReactiveCommand<Unit, Unit> _search;
//        private readonly ReactiveCommand<Unit, Unit> _login;
Далее создаю публичные Search и Login, которые связываются через биндинг с вью.
C#
1
2
//        public ICommand Search => _search;
//        public ICommand Login    => _login;

В вашем варианте:
C#
1
2
        public ReactiveCommand<Unit, Unit> Search {get;}
        public ReactiveCommand<Unit, Unit> Login   {get;}
Компилятор ведь разложит их примерно в тот же вид, что у меня, т.е. на поля и по 2 методах Set и Get для каждого.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
18.09.2020, 06:00
Цитата Сообщение от SuprSonic Посмотреть сообщение
А в чем толк таких преобразований?
Уменьшение кода.
Поля _search и _login кроме как в свойствах Search и Login нигде не используются.
Свойства эти только ссылаются на эти поля.
То есть по факту это свойства "Только для Чтения" но реализованные более громоздко.

Явная типизация команд позволяет использовать методы типа присущие ему.
Допустим, в интерфейсе ICommand нет метода принудительного вызова события.
Но на практике он часто нужен.
Например метод Invalidate в такой реализации Новая реализация RelayCommand с исправлениями от proa33 и kolorotur [WPF, Элд Хасп].
Явная типизация позволяет использовать подобные методы и другие члены типа.

В реализации ReactiveCommand<Unit, Unit>, кроме членов ICommand, есть несколько десятков других членов: свойств, методов, методов расширений.
И явная типизация позволяет обращаться к ним.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.09.2020, 06:00

Асинхронность
Добрый день, у меня такая проблема. Создал поток, запустил его и программа заглючивает, но действие выполняет. Дело в том что сама...

Асинхронность?
Уже как то создавал подобную тему, но моя текущая реализация меня не устраивает чуть более чем полностью, создам новую. Есть у меня некая...

Асинхронность в js
почему в консоле не находит переменную obj, но когда убираю setTimout, только тогда находит async function regUser() { ...

Асинхронность
Всем привет) Я новичек в ноде, разрабатываю веб сервер. this.tokens.get(token, function(msg, that) { if (msg) { ...

Потоки. Асинхронность
Уважаемые специалисты, помогите пожалуйста с определениями, прошу не давать ссылки на msdn, потому что уже все там перечитал, но вникнуть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru