【发布时间】:2012-06-29 09:04:51
【问题描述】:
我正在使用backgroundWorker 进行长时间运行的操作:
BackgroundWorker backgroundWorker = new BackgroundWorker() { WorkerSupportsCancellation = true, WorkerReportsProgress = true };
backgroundWorker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
};
backgroundWorker.ProgressChanged += delegate(object s, ProgressChangedEventArgs args)
{
someViewModel.SomeProperty.Add((SomeObject)args.UserState);
};
backgroundWorker.DoWork += delegate(object s, DoWorkEventArgs args)
{
someViewModel.SomeList.ForEach(x =>
{
someViewModel.SomeInterface.SomeMethod(backgroundWorker, someViewModel, someViewModel.SomeList, x);
});
};
backgroundWorker.RunWorkerAsync();
然后在SomeInterface.SomeMethod:
public void SomeMethod(BackgroundWorker backgroundWorker, SomeViewModel someViewModel//....)
{
//Filtering happens
backgroundWorker.ReportProgress(0, someObjectFoundWhileFiltering);
}
所以,说到:
backgroundWorker.ProgressChanged += delegate(object s, ProgressChangedEventArgs args)
{
someViewModel.SomeProperty.Add((SomeObject)args.UserState);//Adding the found object to the Property in the VM
};
在someViewModel.SomeProperty.Add((SomeObject)args.UserState); 线上,SomeProperty 上的装置没有开火,UI 只是锁定。
我做错了什么?这是更新UI thread 的正确方法吗?
【问题讨论】:
-
把 backgroundWorker.ReportProgress(0, someObjectFoundWhileFiltering);在 DoWork() 方法中。有什么理由在被调用的方法中?
-
SomeProperty 的类型是什么。您确定 Add 方法会触发事件(例如 NotifyPropertyChanged)。如何捕捉到 someviewmodel 对象中 SomeProperty 的变化?
-
代码看起来基本OK,someViewModel.SomeProperty到底是什么?
-
@HenkHolterman
someViewModel.SomeProperty是List<EntityObject>。 -
您可能只是经常点击
updateprogress。在那之前我已经把我的 GUI 锁起来了……顺便说一句;如果您对其执行.Add(),则该属性的“设置”不会触发...
标签: c# .net wpf multithreading backgroundworker