问题描述
|
我使用c#创建了WPF应用程序。我必须在这里从MysqL databse获取更多数据。我用于此ODBC 3.51连接器。当数据加载冻结我的应用程序时。
我正在尝试使用线程解决该问题。但是我无法使用线程来解决此问题。请建议解决我的问题的方法...
解决方法
使用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。稍微幻想一下,您就可以改善这种愚蠢的行为,从而获得不错的UI体验(取决于应用程序)。
通常建议在单独的线程(BackgroundWorker)中进行长时间操作。有一个警告:不要在DoWork事件中创建WPF元素。这不会做,因为所有派生类型的DependencyObject必须在使用它们的同一线程中创建。
还有其他解决方案可以做到这一点,例如直接创建线程或使用基于事件的异步模式,但是我建议对任务使用BackgroundWorker,因为它可以为您处理管道。最后,结果是相同的,但实现起来要容易得多。