VB.NET应用程序在最小化时冻结

时间:2014-11-26 19:57:42

标签: vb.net forms freeze minimize

我有一个Windows窗体应用程序,由单个窗体组成,单击几个按钮即可解析大量文本。

有大量的代码可以解析XML文件的每个节点,通常大约有5000个包含20个子节点的节点,而且那些节点有更多的子节点,依此类推,只是为了创建一个图像文件的大小。

在迭代代码时,就像在解析数据时一样,如果我按下最小化按钮,它将不会最小化但进入“无响应”状态。我的猜测是,在解析数据时无法处理最小化函数。

有没有办法设置中断到最小化/最大化/关闭按钮,或设置优先级,或任何其他解决方案,以实现平滑最小化窗体?

提前致谢

2 个答案:

答案 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属性(然后修复错误,再试一次..)
  • 在使用之前验证您的数据完整性(最糟糕的情况)

编辑:BGW不是唯一的方式。在关注Threads and Threading建议时,请查看Managed Threading Best Practices

答案 1 :(得分:-1)

由于您在主线程中解析XML,因此在解析完成之前,GUI无法更新。最好的选择是使用BackgroundWorker。它将启动另一个线程,允许您执行文件解析,同时让GUI响应用户输入。