2014-10-17 126 views
0

我被困在使用正确的后台工作,应用程序需要与数据库进行通信,所以它需要更长的时间和UI冻结了一段时间,我需要创建一个函数执行数据库事情,并等待工作完成,此时,我想显示一种通知用户有关应用程序状态(加载,忙碌,下载)的窗口。在WPF应用程序中正确使用后台工作

我的代码

我没有写任何代码还没有,但我这里还有我需要什么:

//instructions 
InitializeComponent(); 

//do this in background and wait until it finnishes 
GetEntitiesFromDatabase(); 

entitiesListView.ItemSource = someList; (GetEntitiesFromDatabase will initialize this list) 
//.... 

我如何可以继续,我知道这个问题可能已经问在论坛上,但我绝望寻找答案,如果这可以做其他方式请帮助我,在此先感谢。

+2

您是否阅读过'BackgroundWorker'或更新的技术文档,比如'Task,async/await'异步执行长时间运行的操作? – 2014-10-17 18:42:00

+1

“我还没有写任何代码” - 恕我直言,你应该在发布问题之前。在你寻找其他人为你解决问题之前,你至少应该想出一些有用的东西。 :p – 2014-10-17 18:55:08

+0

hi @HamletHakobyan,我听说过assync/await的事情,你能链接好的话题吗? – Redaa 2014-10-17 18:55:25

回答

2

如果您要直接操作用户界面,那么当您不在UI线程(请参阅BackgroundWorker)时,您需要使用Dispatcher.BeginInvoke

Dispatcher.BeginInvoke(new Action(() => 
{ 
    entitiesListView.ItemSource = someList; 
}), null); 

你也可以绑定的项目源到您的视图模型(一个更好的主意)和框架将元帅的变化到绑定属性为您服务。

基本上,使用Dispatcher.BeginInvoke或切换到MVVM(WPF本来打算使用)。

+0

感谢您的回答,我的用户dispatcher.beginInvoke,但它不工作,不知道你的语法寿: 'ProductsListView.Dispatcher.BeginInvoke(新的行动(()=> { 如果 (allProducts = null) ProductsListView。ItemsSource = allProducts; }));' 我用过这个,但调度程序不更新listview项源 – Redaa 2014-10-17 18:58:36

+0

@User1只要你没有得到一个跨线程异常;它确实如此。检查你的变量,看看它的设置。我修正了语法,谢谢你注意到这个错误。 – BradleyDotNET 2014-10-17 19:01:51

相关问题