在WPF应用程序中正确使用Background Worker

时间:2014-10-17 18:34:11

标签: c# wpf multithreading

我坚持正确使用后台工作程序,应用程序需要与数据库通信,因此需要更长时间并且UI冻结一段时间,我需要创建一个执行数据库事务的函数并等待直到工作完成,这次,我想显示一种窗口,告知用户应用程序状态(正在加载,忙碌,下载)。

我的代码

我还没有写任何代码,但这就是我需要的:

//instructions
InitializeComponent();

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

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

我怎么能继续,我知道这个问题可能已在论坛上提出,但我很想找到答案,如果可以通过其他方式做到,请帮助我,提前谢谢。

1 个答案:

答案 0 :(得分:2)

如果您要直接操作这样的UI,则当您不在UI线程上时,需要使用Dispatcher.BeginInvoke(在BackgroundWorker中读取)。

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

您还可以绑定项目来源到您的视图模型(更好的主意),框架将为您绑定对绑定属性的更改。

基本上,要么使用Dispatcher.BeginInvoke,要么切换到MVVM(无论如何都要使用WPF)。