Приложение WinForms кажется "Не отвечает" при получении данных из базы данных? - PullRequest
2 голосов
/ 29 января 2011

Я работаю над приложением WinForms (VB.NET), которое обрабатывает операции CRUD.Когда он загружает данные, он выглядит как «Не отвечает», и когда загрузка завершена, все будет нормально.

Как вы решаете подобные вещи, когда ваши формы выбирают записи из базы данных?

Большое спасибо.

Ответы [ 3 ]

5 голосов
/ 29 января 2011

Вы можете использовать BackgroundWorker для разгрузки длительных операций в фоновом потоке, чтобы избежать блокировки основного потока пользовательского интерфейса.

2 голосов
/ 29 января 2011

Все приложения Windows таковы, что если вы выполняете какие-либо длительные операции с вашими событиями, вы получите «не отвечает» в течение некоторого периода времени, потому что программа не отвечает на остальную часть системы.У вас есть несколько вариантов здесь:

  • Application.DoEvents, если у вас есть цикл с множеством дискретных быстрых операций, и DoEvents после каждой операции
  • выдвигать задачу в фоновом режиме, через потоки илиBackgroundWorker.

Если вы будете использовать второй вариант, убедитесь, что вы ничего не обновляете в пользовательском интерфейсе напрямую, потому что он сломается, вместо этого используйте Invoke ().

1 голос
/ 11 июля 2013

Если вы используете одиночный интерфейс , то лучше использовать 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 идеально подходят для работы с другими устройствами, такими как принтеры. То есть вы, вероятно, не захотите, чтобы ваша программа остановилась, пока она не закончит печать документа; по этой причине новый поток может обрабатывать задание на печать, пока вы продолжаете использовать вашу программу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...