wpf表单冻结,从数据库中获取数据

时间:2011-06-23 11:32:56

标签: mysql c#-4.0

我使用c#创建了WPF应用程序。我必须从mysql数据库中获取更多数据。我用于这个ODBC 3.51连接器。当数据加载冻结我的应用程序时。 我试图使用thread修复这个问题。但我无法使用线程来解决这个问题。请建议解决我的问题......

1 个答案:

答案 0 :(得分:2)

使用BackgroundWorker - 课程。它的用法非常简单,经常用于加载数据等任务。以下示例显示了它的用法:

BackgroundWorker bgWorker = new BackgroundWorker() { WorkerReportsProgress=true};  
bgWorker.DoWork += (s, e) => {      
    // Load here your data      
    // Use bgWorker.ReportProgress(); to report the current progress  
};  
bgWorker.ProgressChanged+=(s,e)=>{      
    // Here you will be informed about progress and here it is save to change/show progress. 
    // You can access from here savely a ProgressBars or another control.  
};  
bgWorker.RunWorkerCompleted += (s, e) => {      
// Here you will be informed if the job is done. 
// Use this event to unlock your gui 
};  
bgWorker.RunWorkerAsync();  

BackgroundWorker的使用允许UI线程继续处理,因此应用程序在加载期间保持响应。但正因为如此,您还必须确保不会发生依赖于加载数据的操作。一个非常简单的解决方案是将主UI元素IsEnabled-property设置为false,在RunWorkerCompleted中将其设置为true。有了一点幻想,你可以改善这种愚蠢的行为,获得良好的用户界面体验(取决于应用程序)。

在一个单独的线程(BackgroundWorker)中进行长时间操作通常是一个很好的建议。有一点需要注意:不要在DoWork事件中创建WPF元素。这是行不通的,因为必须在使用它们的同一个线程中创建所有派生类型的DependencyObject。

还有其他解决方案可以做到这一点,例如直接创建一个线程或基于事件的异步模式,但是我建议使用BackgroundWorker来完成你的任务,因为它为你提供了管道。最后,结果是一样的,但通往它的方式要容易得多。