Windows Forms: индикатор прогресса не отвечает

У меня есть небольшое приложение для конвертирования нескольких форматов файлов с основной формой окна, которая содержит несколько текстовых полей, кнопок и т.д. У меня есть еще один класс "Документ", который обрабатывает всю фактическую работу по преобразованию, и моя форма по существу повторяет через все файлы и вызывает соответствующие методы документа для преобразования файлов. Хотя это происходит, форма перестает отвечать. Я создал еще одну простую форму с индикатором выполнения и кнопкой отмены, чтобы начать, когда конверсия начнет предоставлять некоторую обратную связь нашим (легко потревоженным) пользователям. Однако, когда новая форма загружается, все элементы управления являются белыми ячейками, и он тоже перестает отвечать. Как только преобразование завершается, индикатор выполнения закрывается правильно, и основная форма снова реагирует.

Есть ли простой способ сделать эти две формы независимыми, чтобы индикатор выполнения мог работать, даже если другая форма не отвечает?

4 ответа

Самое простое решение - обработать вашу обработку в фоновом потоке с помощью компонента BackgroundWorker. Вы можете перетащить его из панели инструментов VS. Он позволяет обновлять поток пользовательского интерфейса с уведомлением о ходе, чтобы вы могли обновить индикатор выполнения, чтобы показать реалистичные значения (что-то более удобное для пользователя, чем наличие индикатора хода "шатер" ).


Самое простое решение - обработать вашу обработку в фоновом потоке с использованием компонента BackgroundWorker. Вы можете перетащить его из панели инструментов VS. Он позволяет обновлять поток пользовательского интерфейса с уведомлением о ходе, чтобы вы могли обновить индикатор выполнения, чтобы показать реалистичные значения (что-то более удобное для пользователя, чем наличие индикатора хода "шатер" ).


Вы должны использовать два потока, чтобы форма продолжала отвечать, пока вы работаете.

Это настолько распространено, что .NET имеет элемент управления BackgroundWorker, который обертывает некоторые из них для вас.


Просто вызовите Application.DoEvent() один раз в секунду, возможно, в вашем цикле. Не так правильно, как BackgroundWorker, но это еще проще.

licensed under cc by-sa 3.0 with attribution.