我有一个C#程序正在检查是否存在文件和注册表项,并在AppendText()
上使用Form.Textbox
查找它正在寻找的每个文件和注册表项。
这是在一个异步的BackgroundWorker
中运行的,现在我的后台工作人员实际上正在快速处理,以至于我的UI线程被AppendText
命令堵塞并且程序崩溃了。如何同步BackgroundWorker
和UI线程,以便在UI线程准备好之前BackgroundWorker
不会再次开始处理?
你有一个BackgroundWorker
,所以你有你需要的一切。在UI线程上调用progress事件,因此如果worker以标准方式报告进度(通过调用ReportProgress(int32, object),并将要附加的字符串作为第二个参数传递,则表单的进度处理程序可以调用AppendText
。后台线程将永远不会以这种方式超越UI。
我怀疑你是在调用BeginInvoke
来更新你的用户界面。解决问题的另一种方法是调用Invoke
。
如果你的后台工作人员保存了10行,你可以做得更好,然后一次将它们全部传递给进度事件。这将减少更新的开销,并使后台线程更快地处理。
想到的一种方法是排队命令并允许UI线程以自己的速度处理它们:: IE创建参数的通用列表(让我们称之为appendtext),后台工作者添加到列表和UI线程读取,调用,然后从列表中删除