|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
||||||||||||||||
ProgressBar в MVVM02.04.2022, 20:36. Показов 9543. Ответов 86
Метки нет (Все метки)
Здравствуйте! Помогите, пожалуйста, нужно сделать индикатор выполнения (ProgressBar) какого-либо процесса в MVVM в Авалонии. Правильно, ли я делаю?
0
|
||||||||||||||||
| 02.04.2022, 20:36 | |
|
Ответы с готовыми решениями:
86
ProgressBar в MVVM
Консольный progressbar или progressbar в TMemo |
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||||||
| 15.04.2022, 14:04 | ||||||||||||||||
|
Sun1212, и так, я вижу, что Вы делаете через токен отмены, но в реализации, которую я показывал ранее, всё куда проще.
Я просто добавил поле isCanceled в модель:
Также я заметил баг, ибо я не знал, что файл ещё нужно закрыть, после того, как его создаю. Поэтому добавил строку file.Close();.Ну и просто в VM теперь создал команду:
P.S. Также нашёл ещё один баг в программе: если нажать на кнопку Start более чем один раз, то одновременно запустятся два одинаковых процесса, по сути. Но по задаче не было такого условия, поэтому я это никак и не предусматривал.
1
|
||||||||||||||||
|
Модератор
|
||
| 15.04.2022, 14:37 | ||
|
Если так, то это неверное ожидание - CancelToken работает не так. Автоматически он проверяется только один раз в момент запуска задачи на исполнение. В общем случае, создание задачи и запуск её на исполнение - это разные по времени действия. И если в этот промежуток токен будет отменён, то в момент запуска задачи будет выкинуто исключение и задача не поставится на исполнение. В большинстве случаев задача создаётся и запускается почти одновременно методом Run или StartNew. Но лаг между создание и запуском всё равно присутствует хоть и сведён к минимуму на сколько возможно. Если же вам надо завершить уже начавшуюся исполняться задачу, то нужно в метод, исполняемый задачей, вставить "ручной" код периодической проверки токена и, если он отменён, выкидывать исключение TaskCanceledException.
1
|
||
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
|
| 15.04.2022, 18:57 [ТС] | |
|
limeniye, cпасибо большое! Но у меня изменилась задача, посмотрите пожалуйста (прикрепляю проект), кнопка Отмена должна закрывать окно с Прогрессбаром, надо наверно как-то заблокировать поток, который запускает Прогрессбар
0
|
|
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
|
| 15.04.2022, 19:00 [ТС] | |
|
0
|
|
|
Модератор
|
||
| 15.04.2022, 19:20 | ||
|
То есть разница с вариантом от limeniye, будет только в том, что он проверяет флаг, а вы будете проверять токен. Добавлено через 2 минуты И есть общепринятая разница в результатах проверки. Если используете токен, то при обнаружении его отмены принято выкидывать исключение. Если же проверяется флаг, то задача просто обрывается (return) с выводом (если надо) промежуточного результата.
0
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 15.04.2022, 19:44 | ||
![]() Добавлено через 4 минуты Элд Хасп, в каких случаях уместно использовать токен отмены, а в каких достаточно обычной переменной?
0
|
||
|
Модератор
|
||
| 15.04.2022, 20:31 | ||
|
Но, как я писал выше, на отмену задачи ожидается выброс исключению OperationCanceledException . Такое поведение ожидаемо от отмены токена, так как при его применении всегда есть вероятность получить исключение при запуске задачи на исполнение. Если же результатом отмены задачи должным быть просто выход из метода с промежуточным результатом, то использование токена отмены в такой ситуации не желательно, поскольку создаёт неожидаемое поведение. В таком случае лучше использовать флаг отмены. Но с флагом отмены тоже не всё так просто, поскольку из-за параллельности выполнения кеши методов не всегда синхронизируются. См. одну одну из тем по этому вопросу: lock в условие или в цикле.
1
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||
| 15.04.2022, 20:52 | ||||||||||||
|
- задал кнопке имя
Close()
1
|
||||||||||||
| 15.04.2022, 21:01 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
||||||
| 15.04.2022, 21:54 [ТС] | ||||||
|
Элд Хасп, посмотрите, пожалуйста:
0
|
||||||
|
Модератор
|
|||||||||||||||||
| 15.04.2022, 22:52 | |||||||||||||||||
|
Где вы "толкаете" ProgressBar ? Вам же нужно отменять action, значит проверку токена надо производит и в теле этого метода. Должно быть нечто подобное:
Sun1212, не обратил внимание. Исключение нужно ловить базовое, а то можете пропустить отмену из метода:
1
|
|||||||||||||||||
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
|||||||||||
| 16.04.2022, 22:19 [ТС] | |||||||||||
|
Элд Хасп, спасибо! Подскажите, пожалуйста, как преобразовать System.Action в System.Action<System.Threading.Cancellat ionToken>?
0
|
|||||||||||
|
Модератор
|
|||||||||||||||||
| 17.04.2022, 00:46 | |||||||||||||||||
|
Action - это ссылка на метод без параметра. А вам нужен метод проверяющий токен. И вы злоупотребляете делегатами, асинхронными методоми. Основа любого вычисления - это синхронный метод. Объявляйте их явно и если будет нужно то потом уже завернёте в задачу.
Sun1212, и как-то запутано, мне кажется, у вас методы объявляются. Где у вас "толкается" ProgressBar? В этом методе window.Update(....)?Если да, то он что делает всего два шага?
1
|
|||||||||||||||||
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
||
| 17.04.2022, 07:56 [ТС] | ||
|
Можно заменить token.ThrowIfCancellation(); (ошибка выдается) на token.ThrowIfCancellationRequested(); ?
0
|
||
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
|
| 17.04.2022, 08:05 [ТС] | |
|
Элд Хасп, что-то у меня всё равно не получается, кнопка Отмены не работает...Если не трудно, можете посмотреть мой проект?
0
|
|
|
Модератор
|
|||||||||||||||||||||||
| 17.04.2022, 12:06 | |||||||||||||||||||||||
|
Писал здесь - поэтому ошибку не видел... Правильно ThrowIfCancellationRequested.Но на будущее лучше выкладывайте через Гит. Архив, чтобы посмотреть, требуется загружать на комп в Студию, что не всегда удобно и возможно. На Гите можно посмотреть без загрузки в браузере. Добавлено через 41 минуту Sun1212, вот здесь Command="{Binding buttonCancel_Click}" buttonCancel_Click - это кликер, а не команда.Для WPF должно быть Command="buttonCancel_Click".Но у вас Avalonia и копилятор не может найти кликер. Вы знаете как кликеры в XAML нужно задавать? Добавлено через 18 минут Sun1212, так же у вас неверно работает сама логика в CB. В кликере вы проверяете поле _task, но вы нигде не задаёте ему значение, поэтому кликер у вас никогда не будет срабатывать.Пример реализации: Подсоединение кликера в Шарпе:
2
|
|||||||||||||||||||||||
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
|
| 17.04.2022, 14:44 [ТС] | |
|
Элд Хасп, cпасибо Вам большое! Всё получилось!!!
0
|
|
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
|||||||
| 17.04.2022, 14:57 [ТС] | |||||||
|
Элд Хасп, кликер задала в Шарпе
0
|
|||||||
|
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
|
|||||||||||
| 18.04.2022, 12:36 [ТС] | |||||||||||
|
Элд Хасп, скажите, пожалуйста, как сделать метод ProgressWindowUpdate без цикла for?
0
|
|||||||||||
| 18.04.2022, 12:36 | |
|
Mvvm
MVVM Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|