Если вы используете одиночный интерфейс , то лучше использовать Application.DoEvents()
. Если у вас есть одна форма, которая выполняет последовательность задач при нажатии кнопки, то вы используете один интерфейс.
Почему Application.DoEvents ()?
Со страницы MSDN на DoEvents () :
Когда вы запускаете форму Windows, она создает новую форму, которая затем ожидает обработки событий. Каждый раз, когда форма обрабатывает событие, она обрабатывает весь код, связанный с этим событием. Все остальные события ждут в очереди. Пока ваш код обрабатывает событие, ваше приложение не отвечает. Например, окно не перерисовывается, если поверх него перетаскивается другое окно.
Если вы вызываете DoEvents в своем коде, ваше приложение может обрабатывать другие события . Например, если у вас есть форма, которая добавляет данные в ListBox и добавляет DoEvents в ваш код, ваша форма перерисовывается, когда поверх нее перетаскивается другое окно. Если вы удалите DoEvents из своего кода, ваша форма не будет перерисована, пока не будет завершено выполнение обработчика события нажатия кнопки. Для получения дополнительной информации об обмене сообщениями см. Ввод пользователя в Windows Forms.
В двух словах: если вы нажмете кнопку и будете ждать выполнения некоторой работы, Application.DoEvents()
обновит пользовательский интерфейс формы и избавится от проблемы (не отвечающей).
Как использовать DoEvents ()
На той же странице MSDN также указано, что
Обычно этот метод используется в цикле для обработки сообщений.
Итак, самый простой способ определить, куда он должен идти, - это найти в вашей программе цикл, в котором происходит длительная операция, и поместить Application.DoEvents()
в этот цикл. Обычно я помещаю его прямо в конец указанной петли.
Например:
foreach (var foo in bar)
{
// Do work
Application.DoEvents();
}
Почему бы не BackgroundWorker для одного интерфейса?
Когда вы создаете несколько потоков, где многопоточность не нужна, вы оставляете возможность утечки потоков. Например, если вы реализуете BackgroundWorker для обработки операций CRUD, но затем по какой-то причине закрываете программу, интерфейс закроется, но поток фонового работника продолжит работу. Вы можете подтвердить, что этот процесс все еще выполняется через диспетчер задач.
BackgroundWorkers идеально подходят для работы с другими устройствами, такими как принтеры. То есть вы, вероятно, не захотите, чтобы ваша программа остановилась, пока она не закончит печать документа; по этой причине новый поток может обрабатывать задание на печать, пока вы продолжаете использовать вашу программу.