我一直在试图创建一个写入数据库而不阻塞UI线程的任务。我遇到的最大问题是等待该过程完成,而不发生阻塞。等待一个漫长的过程,仍然在更新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
),所以它不会被锁定。
我在做什么错?
欢迎(因此)。一些小事情:1。请不要在“C#.NET(3.0)”之类的东西前加上标题。那是什么标签用于[所以]。 2.请不要签名。 3.说到标签,你应该通过添加适当的标签告诉我们你是否使用winforms或wpf或其他。 –
对不起,我不知道该用什么来标记它,用5个标签帽,我没有说。我正在使用Winforms(现在是一个标签) –
@JohnSaunders:我强烈反对你的建议,不要在标题中包含标签(例如C#.NET WinForms)。原因:Google是人们进入翻页页面最常用的方式。拥有包含这种背景的标题使得决定问答是否相关更为迅速。 – ToolmakerSteve