2011-06-23 45 views
0

与获取数据冻结我使用C#。我在这里得到更多的数据从MySQL databse.I'm使用这一个ODBC 3.51 connector.when数据加载冻结我的应用程序创建WPF应用程序。 我试图解决这个问题使用线程。但我无法做到这一点使用线程。请建议的方式对解决我的问题......WPF形式从数据库

回答

2

使用BackgroundWorker -class。它的使用非常简单,常常用于加载数据等任务。下面的例子演示了它的用法:

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你的任务,因为它HANDELS为您的管道。最后,结果是一样的,但它的方式要容易得多。

+0

感谢lot.I将尝试添加背景工人在我的应用程序。 – hmlasnk

+0

@Hemal:如果这个答案帮助你,请点击下面的投票按钮,复选标记,以纪念这个答案为接受的答案。 – HCL

+0

此评论是成绩。再次感谢。 – hmlasnk