|
|
|
Асинхронное обновление состояния команды06.05.2024, 23:11. Показов 3890. Ответов 65
Метки нет (Все метки)
xellan24rus, скорее всего порядок "обновления" на это влияет. Потому что не раз сталкивался немного с другой вещью: есть свойство в VM, оно же используется в качестве CanExecuted в некой команде. Но! Если привязать элемент View IsEnabled к тому свойству напрямую - все замечательно. А вот, если этот элемент ведется от этого же свойства, но от команды - он "енаблируется" только по тычку мыши по окну! Хотя все возможные дебаги показывают что это свойство давно уже в TRUE. Не стал сильно разбираться, переделал, но пока такой вот "факт" остался непонятным явлением...
Добавлено через 3 минуты Иными словами, происходит некая "серия команд", часть из которых не достигает получателей (типа застревает), но если тыкнуть окно - все приходит. Что интересно - точно с таким же проектом на таких же условиях все работает. Вообще не понял что происходит с этим, каждую запятую проверял - ну блин вообще отличий нет. Но не работает. Чудеса.
0
|
|
| 06.05.2024, 23:11 | |
|
Ответы с готовыми решениями:
65
Потоки: асинхронное обновление объектов на карте
Асинхронное обновление Partial view |
|
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
|
|
| 09.05.2024, 17:18 | |
|
wizard41,
А использовать для решения проблемы SynchronizationContext и CommandManager в вашем случае это криминально?
0
|
|
|
|
||
| 09.05.2024, 17:22 [ТС] | ||
|
0
|
||
|
Модератор
|
||
| 09.05.2024, 17:23 | ||
|
Команда - это абстракции метода который не всегда можно вызывать. Например, у вас COM порт и есть метод передачи в него серии байт void Send(byte[]). Но пока передача массива байт не завершилась, передавать следующий массив нельзя. Поэтому надо проверить перед вызовом метода, разрешена ли сейчас передача. Для этого создаётся метод bool CanSend(byte[]). Но не будеши же в вечном цикле вызывать этот метод и ждать когда он разрешить передачу. Поэтому добавляется событие EvenHandler CanSendChanged.Так как такая связка из трёх членов может понадобиться где угодна и часто, то и добавили абстракцию ICommand в ОСНОВНЫЕ типа .Net.
0
|
||
|
|
|
| 09.05.2024, 17:26 [ТС] | |
|
proa33, про
SynchronizationContext подумывал еще неделю назад. Но, к сожалению, времени на эксперименты особо уже не было, поэтому решил проблему "в обход", а само решение оставил на потом. И то, случайно попался похожий вопрос на форуме и в порядке обсуждения его поделился своим случаем.Заказчик уже хочет бету, а у меня ни одного теста не написано еще... Ну и там уже пора переходить к другой фазе..
0
|
|
|
Модератор
|
||
| 09.05.2024, 17:28 | ||
|
Вместо них используются различные блокировки, очереди, буферы, асинхронные методы и т.д. Например, для COM порта метод просто примет следующий массив байт, будет держать его в буфере, и потом автоматически передаст как порт освободится. Но "в глубине" всего этого по прежнему будут все те же три члена, но возможно, уже по отдельности, а не объединённые в команду.
0
|
||
|
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
|
||||||||||||
| 09.05.2024, 17:31 | ||||||||||||
1
|
||||||||||||
|
|
|||
| 09.05.2024, 17:46 [ТС] | |||
|
Элд Хасп, хорошо. Тогда как бы вы советовали использовать ваш последний вариант RC - вместе или вместо того, что использовалось ранее?
Про COM-порт - в тестовом проекте лишь небольшая "выжимка" из настоящего для быстрой демонстрации. На самом деле CanSend(byte[]) не нужен, т.к. в ядре уже сделана проверка на "занятость" и целый буфер для такого случая. Хотя такой случай в нормальных условиях возникнуть не должен, ну разве что какой-то сумасшедший будет давить на кнопки с частотой 50Гц ).Добавлено через 5 минут Добавлено через 3 минуты
0
|
|||
|
Модератор
|
||
| 09.05.2024, 18:00 | ||
|
Что касается реальной реализации, то если в Модели нет нужного события от которого можно дёргать RaiseCanExecuteChanged, то можно добавить таймер, который будет его вызывать 2-5 раз в секунду. Какой-то большой нагрузки это не создаст.
1
|
||
|
|
|
| 09.05.2024, 18:13 [ТС] | |
|
Элд Хасп, касательно CanSend, наверное, надо учитывать еще то, что он повлечет за собой реализацию дополнительной логики для выполнения действия, если это действие было отменено из-за чего-то (занятости).
С другой стороны, ничто не мешает ставить команды в очередь, которые все же отправятся куда надо, когда буфер освободится. Это дешевле, с точки зрения реализации. Мне кажется. Примерно так это сделано у меня: отдельный поток постоянно занимается опросом основных параметров, т.е. отправляет одну и ту же команду. Но иногда возникает необходимость отправить что-то другое. Как "вклинится" в этот поток? Правильно - сделать некий список команд, и если он пуст, то выполняется основная работа. Если же что-то в нем есть - выполняем от туда с последующим удалением. Так мне показалось проще, чем с предварительной проверкой.
0
|
|
|
Модератор
|
|
| 09.05.2024, 18:38 | |
|
wizard41, но вы сами говорите, что у вас есть некий сигнал из устройства, по которому надо изменять состояние команды.
Зачем? Наверное, для того что по этому сигналу меняется состояние модели, и какие-то её методы становится нельзя вызывать?
0
|
|
|
|
||
| 09.05.2024, 18:45 [ТС] | ||
|
И пока не произойдет получения верного ответа на "дружеский" запрос - нет надобности в кнопках.
0
|
||
|
Модератор
|
||
| 09.05.2024, 19:00 | ||
|
Добавлено через 43 секунды Вы тем самым реализуете по сути туже команду, но своим уникальным, а не общепринятым способом.
0
|
||
|
|
||
| 09.05.2024, 19:11 [ТС] | ||
|
Слово "команда" в последних двух постах означала последовательность символов, отправляемая по каналу связи. Это не связано с решаемой задачей о команде ICommand в теле приложения, которая не обновляла UI-элемент. Добавлено через 1 минуту На текущий момент проблема вами решена. Придется встраивать это все, но уже в продакшен, на скорую руку...
0
|
||
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
||||||||||||
| 09.05.2024, 22:29 | ||||||||||||
Из за не возможности получить ошибку, я оставил как есть всё.wizard41, Дописал класс AsyncRelayCommand. Теперь Enable меняется как нужно. Использование
0
|
||||||||||||
|
Модератор
|
||||||||
| 09.05.2024, 23:02 | ||||||||
Смысл асинхронной команды в том, что у неё есть какие-то дополнительные вспомогательные и нужные челны. Например, состояние занятости пока выполняется команда. Добавлено через 1 минуту Зачем? Добавлено через 1 минуту А если во время await _execute(); состояние команды несколько раз меняется?
0
|
||||||||
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
||||
| 09.05.2024, 23:10 | ||||
|
Элд Хасп, вызывает CommandManager.InvalidateRequery после выполнения команды.
Далее копипаст текста.
Добавлено через 2 минуты
0
|
||||
|
Модератор
|
|||
| 10.05.2024, 00:01 | |||
|
А если во время
await _execute(); состояние команды несколько раз меняется?
Что, мягко говоря, не оптимально. Но при длительном исполнении ExeCute состояние CanExeCute может меняться многократно, а может и ни разу.В вашей же логике предусматривается только однократное изменение после завершения ExeCute. Что, скажем так, несколько ограничено. Единственный вариант из множества возможных.Добавлено через 3 минуты В общем случае, команда может зависеть от множества факторов и нужно прописывать зависимость от них при создании её экземпляра, а не в классе где единый код для всех экземпляров. Добавлено через 6 минут xellan24rus, просто поверьте на слово, такая реализация асинхронной команды абсолютно бесполезна. Просто выкиньте её.
1
|
|||
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
|
| 10.05.2024, 01:03 | |
|
Элд Хасп, вы правы. Это не оптимальное решение. И использовать нет смысла.
0
|
|
|
|
|
| 10.05.2024, 18:56 [ТС] | |
|
Элд Хасп, отчет рефакторинга:
поменял RC и INPC на ваши во всех проектах. Все собственные команды окна (приложения) работают как и прежде, т.е. им не нужен RaiseCanExecuteChanged().Зависимость создана только для команды, в которой CanExecuted устанавливается позднее, из потока. Все обновляется как положено. Единственно что, поправил метод inpcbase Set<T> с void на bool, т.к. иногда удобно делать что-то еще, если данное свойство поменялось.Благодарю за содействие!
0
|
|
|
Модератор
|
|||
| 10.05.2024, 20:13 | |||
|
Объясню причины. Зависимости можно реализовывать: 1) "От источника" - это когда источник зависимости "знает" всех кто от него зависим и при изменении влияет на каждого зависимого; 2) "В зависимости" - это когда зависимость сама следит за своими источниками. Когда зависимости реализуются "1 к 1", то разница между этими двумя способами неочевидно. Но если вы чуток имеете знания по типичной для .Net архитектуре зависимостей, то сразу обратите внимание, что первый способ практические никогда не используется. Второй же очень распространён. Самый типичный пример - это события, через который зависимости следят за источниками. Вот именно для того чтобы не было соблазна использовать первый способ, который кажется иногда проще, но в действительности ломает архитектуру зависимостей, я и убрал возврат bool в методе. И теперь реализацию зависимостей нужно делать только в методе OnPropertyChanged (или в прослушке события), как оно и принято в .Net.
0
|
|||
| 10.05.2024, 20:13 | |
|
Обновление состояний checkBox при изменении состояния соответствующего comboBox Асинхронное выполнение команды
Обновление свойств компонентов на обновление состояния родителя Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302
Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
|