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