Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
1 / 1 / 4
Регистрация: 05.05.2017
Сообщений: 521

Progress bar

12.03.2019, 23:49. Показов 4766. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как сделать Progress bar? Контроллер обрабатывает большое количество данных, отсылаю их по апи в 1с, хочу чтобы на странице отображался ход выполнения процесса - количество обработанных записей. Есть какие нибудь внятные примеры как это сделать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.03.2019, 23:49
Ответы с готовыми решениями:

asp.net ajax progress bar
Пишу ajax progress bar контрол. Решил реализовать это с помощью серверного обработчика (handler), коллекции Cache и ajax запросов по...

Progress Bar, как посчитать ориентировочное время работы приложения на сервере?
На сайте реализована такая фича: Клиент кликает кнопку, и всё, что он видит на экране печатается в ворде с помощью Word componentы....

Можно ли переделать Progress bar в Track bar?
Можно ли переделать Progress bar в Track bar? От прогресбара нужно всего лишь, что бы можно было перемещать внутри его (заливку) ползунок.

15
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,895
13.03.2019, 04:19
Pantheonptz, не надо так делать. Никогда. Контроллер ни при каких условиях не должен загружаться долгими задачами. Его задача - или выполнить действие сразу или, если не может, поставить это действие в какую-то очередь, чтобы его выполнил уже другой сервис, который не будет ограничен во времени.

Рекомендую такой подход: контроллер принимает необходимые параметры от пользователя, формирует задачу, пишет её в базу и выдаёт пользователю какой-то ID этой задачи. Саму долгую задачу пускай решает уже отдельная служба в идеале работающая вне веб-приложения (реально отдельный процесс или в виде WIndows-службы или в виде консольного приложения постоянно запущенного) или, для простоты решения (но это не правильно!) в виде отдельного потока в самом веб-приложении.

JavaScript на клиенте будет периодически опрашивать веб-сервер (уже другой контроллер) на предмет статуса задачи с указанным ID и либо рисовать progress bar, если таковой статус дискретен, либо тупо отображать infinite progress, если статус "ещё не закончено".

Выполнять долгие задачи в веб-приложении не надо по двум причинам:
* вы занимаете поток из пула ASP.NET MVC, который мог бы обрабатывать другие запросы;
* IIS полностью контролирует жизнь веб-приложения и может со спокойной совестью его грохнуть (или перезапустить) в любой момент, ибо думает, что вы понимаете, что такие приложения про быстрый "запрос-ответ", а долгие задержки в контроллерах - явно зависания;
1
Эксперт .NET
 Аватар для Wolfdp
3784 / 1758 / 371
Регистрация: 15.06.2012
Сообщений: 6,527
Записей в блоге: 3
13.03.2019, 14:57
Цитата Сообщение от Usaga Посмотреть сообщение
отдельная служба в идеале работающая вне веб-приложения
Чтож вы так не любите монолитные приложения... XD
0
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,895
13.03.2019, 17:17
Wolfdp, речь не о разделении ради разделения. Приложения хостящиеся в IIS себе не хозяева. IIS их может грохнуть потому, что потому. Оттуда и рекомендация не держать в веб-приложении никаких долгоиграющих сервисов. К .NET Core это не относится)
0
1 / 1 / 4
Регистрация: 05.05.2017
Сообщений: 521
13.03.2019, 20:01  [ТС]
Если использовать для длительной задачи Hangfire? BackgroundJob.Enqueue запускает задачу в фоне. Допустим в фоне отправляются данные, страница при этом показывает прогресс сколько записей отправлено, после завершения предоставляется ссылка на скачивание лога, что добавлено и где с ошибкой.
Вот здесь есть про прогресс бар https://www.codeproject.com/Ar... ing-Live-D но как то непонятно.
0
HF
 Аватар для HF
1303 / 882 / 199
Регистрация: 09.09.2011
Сообщений: 2,590
Записей в блоге: 2
13.03.2019, 20:38
Цитата Сообщение от Pantheonptz Посмотреть сообщение
Если использовать для длительной задачи Hangfire? BackgroundJob.Enqueue запускает задачу в фоне. Допустим в фоне отправляются данные, страница при этом показывает прогресс сколько записей отправлено, после завершения предоставляется ссылка на скачивание лога, что добавлено и где с ошибкой.
Не забывайте, что эта страница отображается только пока вы её запустили. Обновили страницу и нужно снова отображать прогресс.
Это очень трудозатратные операции. После отображения страницы вы должны зацепиться в контекст выполняемой задачи. Как? нереал. Можно из выполняемой задачи обновлять БД, а ваш метод будет постоянно перечитывать данные для отображения, но... это нагрузка и блокировка базы.

Цитата Сообщение от Pantheonptz Посмотреть сообщение
Вот здесь есть про прогресс бар https://www.codeproject.com/Ar... ing-Live-D но как то непонятно.
Это SignalR. Такая же хрень, только уже "из коробки".

Ваша проблема - откуда и как брать прогресс чтобы не положить остальное и отображать корректно и красиво. Вот тут и проблема, а не в том как прогресс выводить.
0
1 / 1 / 4
Регистрация: 05.05.2017
Сообщений: 521
13.03.2019, 21:06  [ТС]
Ну можно в статической переменной хранить количество обработанных записей и ajax-ом получать из view ее значение. а статическую переменную будет изменять фоновый процесс. Также можно ввести флаг - static bool идет ли в данный момент процесс, чтобы после перезагрузки страницы ничего не путалось.
0
HF
 Аватар для HF
1303 / 882 / 199
Регистрация: 09.09.2011
Сообщений: 2,590
Записей в блоге: 2
13.03.2019, 21:55
Цитата Сообщение от Pantheonptz Посмотреть сообщение
Ну можно в статической переменной хранить количество обработанных записей и ajax-ом получать из view ее значение.
А теперь задумайтесь о таких вещах:
- больше одного пользователя. Значит переменная должно быть не одна, а много... dictonary? Причём привязка по какому-то признаку, например пользователь. А если этот таск должен выполняться больше 1 раза для одного пользователя? (например, массовые аплоады запущенные с разных страниц)
- упавший процесс не обновил значение переменной и ... она так и осталась true, 88%
Всё.. начинаются заглушки и костыли.
0
1 / 1 / 4
Регистрация: 05.05.2017
Сообщений: 521
13.03.2019, 22:07  [ТС]
ну тогда хранить в переменных сессии. они и пользователя идентифицируют и рано или поздно уничтожаться.
0
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,895
14.03.2019, 03:53
Pantheonptz, сессия может уничтожиться раньше, чем задача закончится. У пользователя может быть несколько сессий, если, допустим, решит с разных машин зайти (почему бы и нет?). Не трогайте сессии. Если вы что-то запишете в сессию, то MVC все обращения к контроллерам, пишущим в сессию, будет обрабатывать последовательно (чтобы не было racing), а это положит производительность на лопатки. Это известная проблема.

Пишите прогресс в базу и не страдайте фигнёй. Детализировать процесс до долей процента смысла не имеет никакого от слова совсем. Либо используйте набор состояний "ещё не начато, начато, закончено", либо, если уж так хочется, то проценты с шагом в десятку. База такое выдержит играючи. Никаких блокировок тут не будет и в помине.

Добавлено через 1 минуту
К тому же, сессия - аспект ASP.NET MVC, а работа с 1С к этому вообще отношения не должна иметь. Получается, что вы вообще всё, что только возможно в одну кучу сваливаете (долгая работа в контроллере, сессия, импорт чего-то в 1С). Хуже и придумать нельзя.
1
HF
 Аватар для HF
1303 / 882 / 199
Регистрация: 09.09.2011
Сообщений: 2,590
Записей в блоге: 2
14.03.2019, 08:50
Цитата Сообщение от Usaga Посмотреть сообщение
либо, если уж так хочется, то проценты с шагом в десятку. База такое выдержит играючи. Никаких блокировок тут не будет и в помине.
Вью не знает про сервис. Ей всё равно "в десятку" оно или нет. Он будет каждые ХХ секунд запросы отправлять. А значит он всё равно будет терзать БД ради одной цифры. Конечно БД справится, но ей бы заниматься своим делом, а она ещё должна прогресс обновлять и отдавать.

Я работал с Hangfire. Загружали тысячи файлов. Никто не задумывался про какой-то прогресс. Очень интересно - идёшь в его админку и видишь статус "Запущен, в работе". Всё, сиди и жди. Потом открываешь, видишь что закончился и статус.

Напишите на винформах загрузчик и смотрите на чудесный прогресс бар.
0
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,895
14.03.2019, 08:52
HF, такой запрос для базы - ниочём даже несколько десятков раз в секунду. Это одно значение по ключу найти. Не имеет смысла вообще об этом волноваться.
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
14.03.2019, 09:57
А еще , задача реализованная в отдельной службе/сервисе и т.п. может предоставлять api для мониторинга своей деятельности , по какому нибудь простенькому протокольчику. Все что останется браузеру . через это апи опрашивать службу о ее состоянии и прогрессе.

Кстати , если все же хостить отдельной задачей под IIS-ом , то можно просто хранить полученные данные в БД как и прогресс их обработки , о чем тут уже писали , таким образом даже если пулл закроется раньше времени , всегда можно по данным в БД вернуться к нужному шагу и продолжить процесс. - но это чуть более навороченная механика , избыточная для простеньких сценариев.
1
1 / 1 / 4
Регистрация: 05.05.2017
Сообщений: 521
15.03.2019, 12:40  [ТС]
Спасибо за советы, приму к сведению. Поскольку задача у меня специфичная то думаю подход я выбрал верный. Мне нужно создать прокладку между двумя системами - по веб апи принимать данные и затем отправлять их же в другую систему. Апи в этом случае пишется для одного пользователя и вряд ли будет запускаться параллельно два и более процесса загрузки или выгрузки одновременно. В случае с загрузкой это в принципе не имеет значения т.к. данные принимаются 1 запись=1запрос, накапливаются в статическом листе и по расписанию пишутся в базу с помощью hangfire. Здесь единственная коллизия которую вижу запуск процесса записи по расписанию во время наполнения статического листа. Тут просто проверяю интервал между текущим временем и последней загрузкой записи. В плане выгрузки(под 1с имел ввиду что принимающая сторона - система 1с, выгрузка также по апи) также сделал при нажатии кнопки на выгрузку создается фоновый процесс hangfire отправляющий данные, он то и посылает с помощью signalr данные для прогресс бара, запускать одновременно несколько выгрузок теоретически возможно, но можно просто запретить это делать, так как никакой практической надобности в этом нет.
0
83 / 61 / 17
Регистрация: 21.08.2015
Сообщений: 1,094
12.11.2020, 11:05
мммда... вопрос был про progress bar, а закончили архитектурными решениями.
Яндекс выдал эту тему на запрос asp core progress bar, но тут нет ничего про прогресс бар.
0
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
12.11.2020, 11:27
Чипс, progress bar в браузере - это джава-скриптовый компонент, в какую бы архитектуру его не пихай ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.11.2020, 11:27
Помогаю со студенческими работами здесь

progress bar
Вообщем суть в этом у меня есть 3 формы в первой форме заполняются эдит1 потом открывается идет отправка этого сообщения на мэйл и...

Progress Bar
Подскажите как сделать чтоб например я создал Progress Bar и один Button. И когда я нажимаю на Button Progress Bar не полностью проходил а...

Progress Bar
Допустим, нужно сделать так чтобы после нажатия на кнопку, прогресс бар начинал свою работу, и после завершения выдавал Сообщение(Message...

Progress Bar
Здравствуйте, хочу сделать Progress Bar круглым внутри, данный код меняет только края заднего фона, стартовую и конечную точку прогресса, а...

progress bar
Написала код для простенького web браузера вот код brouser.h #ifndef BROWSER_H #define BROWSER_H #include...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru