将所有的CPU密集型任务从GUI中移出,并调用回GUI来报告任何状态。
主应用程序
不应该冻结。我编写了一个应用程序,生成了500多个线程(同时),并在它们异步处理多个数据库调用时进行管理(.net 2)。我认为您需要系统地将所有进程移动到线程安全的情况下,并删除任何直接的GUI调用。
补充说明:我如何运行500多个线程:
智能锁的使用从一开始就应用于所有共享数据位置。请参阅我的博客文章
C# .Net中的智能资源锁定以实现线程安全代码使用ThreadPool,匿名委托和锁的C#多线程编程
创建了一个指定具有数据和错误状态作为属性的操作行为接口。
创建了一个基类(用于第4步和第5步的类),该基类生成、启动和清理线程操作。没有业务逻辑,只是在一个位置处理线程的方法。
根据第2步中的接口创建了一个类,并且还继承自第3步。通过接口,该类需要获取数据并放置数据(通过本地化锁实现线程安全),并报告其状态。如果没有可以进行的工作,该类还设计为通过thread.Sleep(0)而不是忙等待来放弃线程循环。
创建了一个管理类(在自己的线程上运行并派生自第3步)。它启动了1-N个第4步的类来执行工作。这些实例中的每一个都被放置到一个工作列表中。
管理类简单地浏览工作列表,寻找已完成工作的实例,如果工作已完成,则将实例移动到已完成工作列表中。管理类还记录状态(通过锁实现线程安全),并公开属性(以及子实例报告的任何错误)。在每次运行后,管理类放弃线程循环,并在再次启动之前休眠250毫秒。
GUI线程具有处理从管理类获取特定状态的工作计时器。它们会从管理类的属性中提取数据,并回调GUI以定位一个控件(gridview),该控件报告所有状态和错误。
通过这样做,我能够实现单独的线程执行特定的工作,如果进程遇到问题,它会报告成功或失败。这些消息会上报给管理器,然后上报给计时器,最终上报给GUI。GUI除了启动管理器和计时器之外不处理任何业务逻辑。
我知道这并不能立即解决你的问题,我感同身受。但在你能够将业务逻辑与 GUI 分离,并在线程(后台工作者)中处理错误情况并将其传递到 GUI 之前,你仍然会对当前代码感到沮丧。
如果某些东西被锁定,那就意味着业务逻辑与 GUI 操作过于紧密耦合,必须在你从 GUI 中获得所需性能之前进行分离。
希望有所帮助。