我使用c#创建了WPF应用程序。我必须从mysql数据库中获取更多数据。我用于这个ODBC 3.51连接器。当数据加载冻结我的应用程序时。 我试图使用thread修复这个问题。但我无法使用线程来解决这个问题。请建议解决我的问题......
答案 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来完成你的任务,因为它为你提供了管道。最后,结果是一样的,但通往它的方式要容易得多。