我有一个Windows窗体应用程序,由单个窗体组成,单击几个按钮即可解析大量文本。
有大量的代码可以解析XML文件的每个节点,通常大约有5000个包含20个子节点的节点,而且那些节点有更多的子节点,依此类推,只是为了创建一个图像文件的大小。
在迭代代码时,就像在解析数据时一样,如果我按下最小化按钮,它将不会最小化但进入“无响应”状态。我的猜测是,在解析数据时无法处理最小化函数。
有没有办法设置中断到最小化/最大化/关闭按钮,或设置优先级,或任何其他解决方案,以实现平滑最小化窗体?
提前致谢
答案 0 :(得分:1)
很抱歉添加与Stephan几乎相同的答案,但等了10个小时让他删除了DoEvents
。
数据收集或解析应该在另一个线程中处理。最简单的方法是使用BackgroundWorker,并实现至少两个事件处理程序:
BGWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
' Move your parsing code here
' use local variables whenever possible
' do the appropriate changes
' and
BGWorker_RunWorkerCompleted( _
ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
' tells your Main thread that it can use the resuls
注意:
您必须小心不要操纵任何用户界面对象 在DoWork
事件处理程序中。而是与用户沟通 通过ProgressChanged
和RunWorkerCompleted
进行界面 事件
我想补充一下:
BGW在其DoWork 中所需的一切都应该保持不变(*)。 DoWork()可以访问主线程中的任何内容(例如:操作FileContent的类实例,调用函数,读取静态变量......)你不应该掉以轻心!这可能由于干扰,如多个工人,状态变化或用户输入,会产生意外行为。
应该处理干扰解析过程的用户输入:使用.RunWorkerCompleted(..)
捕获主线程何时可以安全地(让用户)访问和操作数据,更改状态等。
(*)最佳举措是将BGW所需的所有内容作为工作开始时实际值的副本。如果你有一个很长的任务要做,并且状态变化可能同时发生(例如:文件系统层次+文件删除 - 运行代码按时间排序结果的日期改变...)你应该:
.Error
参数的RunWorkerCompletedEventArgs
属性(然后修复错误,再试一次..)答案 1 :(得分:-1)
由于您在主线程中解析XML,因此在解析完成之前,GUI无法更新。最好的选择是使用BackgroundWorker。它将启动另一个线程,允许您执行文件解析,同时让GUI响应用户输入。