Я пытаюсь создать задачу, которая записывает в базу данных без блокировки потока пользовательского интерфейса. Самая большая проблема, с которой я столкнулась, - это ждать завершения этого процесса без блокировки.
Я пытался избежать использования DoEvents
(хотя он довольно часто использовал эту программу прямо сейчас, я бы хотел отказаться от ее использования, двигаясь вперед).
Я попытался создать процесс для запуска во втором потоке и дождаться его завершения, а также с помощью BackgroundWorker
.
Проблема с этим связана с тем, что код не работает в другом потоке, но пытается найти способ дождаться его завершения.
В принципе, прямо сейчас я делаю следующее:
- Подключение к базе данных
- Создайте фоновый рабочий (или поток), чтобы выполнить запись в базу данных (я, вероятно, вернусь к
BackgroundWorker
, чтобы использоватьReportProgress
- Запустите нить или
BackgroundWorker
- Используйте цикл While, чтобы дождаться завершения потока /
BackgroundWorker
. Для потока я жду, покаIsAlive
станет ложным, дляBackgroundWorker
я переключу логическую переменную. - Я информирую пользователя о завершении процесса.
Проблема в # 4.
Выполнение цикла while без кода в нем или Thread.Sleep(0)
оставляет заблокированный пользовательский интерфейс (Thread.Sleep(0)
заставляет программу также принимать 100% ресурсов программы)
Итак, я:
while (!thread.IsAlive)
Thread.Sleep(1);
-или -
while (bProcessIsRunning)
Thread.Sleep(1);
который блокирует пользовательский интерфейс.
Если я вызываю Application.DoEvents()
там, пользовательский интерфейс обновляется (хотя он доступен для кликов, поэтому я должен отключить всю форму во время выполнения этого процесса).
Если я запускаю процесс синхронно, мне все равно нужно создать какой-то способ обновления интерфейса (на мой взгляд, вызов DoEvents
), чтобы он не был заблокирован.
Что я делаю неправильно?