我使用的是backgroundWorker
做一個長期運行的操作:BackgroundWorker.ReportProgress()不更新財產和鎖定UI
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的變化? – Hyralex
代碼看起來基本上OK,someViewModel.SomeProperty究竟是什麼? –