我一直在尝试创建一个在不阻塞 UI 线程的情况下写入数据库的任务。我遇到的最大问题是等待该过程完成而不会发生阻塞。
我一直在尝试避免使用DoEvents
(尽管现在通过这个程序非常频繁地使用它,但我想在前进的同时停止使用它)。
我试图创建进程以在第二个线程上运行并等待它完成以及使用BackgroundWorker
.
我遇到的问题不是让代码在不同的线程中运行,而是试图找到一种方法来等待它完成。
基本上,现在我执行以下操作:
- 连接到数据库
- 创建一个后台工作者(或线程)来写入数据库(我可能最终会使用,
BackgroundWorker
所以我可以使用ReportProgress
- 启动线程或
BackgroundWorker
- 使用 While 循环等待线程 /
BackgroundWorker
完成。对于线程,我等待IsAlive
变为假,对于BackgroundWorker
,我切换一个布尔变量。 - 我让用户知道该过程已完成。
问题出在#4。
执行一个没有代码的 while 循环,或者Thread.Sleep(0)
让 UI 被阻塞(Thread.Sleep(0)
使程序也占用 100% 的程序资源)
所以我这样做:
while (!thread.IsAlive)
Thread.Sleep(1);
-或者-
while (bProcessIsRunning)
Thread.Sleep(1);
这会阻止用户界面。
如果我Application.DoEvents()
在那里调用,UI 会更新(尽管它是可点击的,所以我必须在此过程运行时禁用整个表单)。
如果我同步运行该过程,我仍然需要创建某种方式来更新 UI(在我看来,是一个DoEvents
调用),因此它不会看起来被锁定。
我究竟做错了什么?