Пункт попытки 2. Попытка быть настолько ясной, насколько это возможно, потому что я выполнял эту задачу намного дольше, чем следовало бы и добился небольшого прогресса.Выполнение строки прогресса в C#
Мне нужно сделать индикатор выполнения для приложения. Прямо сейчас все происходит в одном потоке пользовательского интерфейса, все обрабатывается и еще много чего, поэтому, когда я выполняю длительный процесс после нажатия кнопки, программа зависает примерно 40 секунд, затем возобновляется с выходом (я не могу изменить это часть, заявление было дано мне). И я также должен сделать кнопку отмены, поэтому, если она попадает во время промежуточного процесса, после этого процесса выполняется проверка флажка Отмена, и если он включен, вырываются из всех методов и возвращаются в исходное положение ,
Что мне нужно сделать, это сделать индикатор прогресса для этого процесса. Два из них, один для промежуточного процесса и один для общего. Промежуточное - это небольшое действие, такое как вызов БД, выход промежуточного процесса (для циклов foreach и foreach).
Я попытался поместить бары в том же окне пользовательского интерфейса и обновить их в том же потоке, что и я, (найдите основные моменты, запустите там бары прогресса и увеличите их на основе моего суждения и петель). Это просто загрузило пользовательский интерфейс еще больше, но он работал (изменчивый ход).
Затем я попытался использовать фона рабочего. То же самое, положить бары в пользовательский интерфейс и запустить их через фоновый рабочий. Проблема с этим, хотя рабочий BG работает, обновление должно произойти в окне пользовательского интерфейса, которое занято обработкой жадного запроса, поэтому оно не обновляется, когда я этого хочу.
Я попытался использовать многопоточность в ядре (без работника BG) и создать новую форму в новом потоке, который будет отражать прогресс, но я был предупрежден о том, чтобы не делать этого (одновременно выполнял 2 потока пользовательского интерфейса) и У меня были проблемы, связанные с ценностями. Не говоря уже о том, что при использовании метода потоковой обработки невозможно получить точное представление о прогрессе, не перегружая центральный процессор (запустите другой поток (true) и сделайте обновление, когда вы вызываете метод updateMethod с некоторой точки в процесс)
Есть ли у меня какие-либо другие варианты? Поскольку наименее негативный аспект является первым, когда я обновляю индикатор выполнения, когда я соглашаюсь с программой.
Почему ваш пользовательский интерфейс занят, когда вы выполняете работу в BackgroundWorker? Вся * точка * BGW такова, что UI * не делает ничего. Поток пользовательского интерфейса должен запускать BGW, а затем просто делать, пока BGW отключается, чтобы сделать это самостоятельно. Используйте соответствующие завершенные и обновленные события для обновления пользовательского интерфейса с прогрессом и результатами фоновой работы. – Servy
@Serve Я использую BGW, чтобы сделать индикатор выполнения, а не пользовательский интерфейс. Основной поток, который имеет пользовательский интерфейс, обрабатывает эту длинную 40-секундную задачу. Включение всего в BGW означало бы переписывание половины всей программы. Как я упоминал в OP, мне это было представлено. – Alexey
У меня была эта идея сделать Apllication.DoEvents(), но она была нахмурилась и упоминалась как «ленточная помощь плохому дизайну». – Alexey