wpf冻结,并从数据库中获取数据

问题描述

| 我使用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,因为它可以为您处理管道。最后,结果是相同的,但实现起来要容易得多。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...