C# MVVM-从BackgroundWorker创建可观察集合-依赖源/对象错误
我刚刚在我的应用程序中引入了一个加载动画。代码运行,但当我与应用程序接口时,它会崩溃,错误是必须在DependencyObject所在的同一线程上创建DependencySource 我已经修改了代码,以便只有检索和处理数据的调用应该在后台线程上,任何类型的可观察集合都应该在UI线程上初始化 但是,仍然会抛出错误!如果我只是让后台工作人员处理“RetrieveItems”方法,那么它会正常工作,但大多数处理都是在“ApplyFilters”方法中完成的,该方法非常广泛,但最终会返回IItemGroupViewModel的列表。什么样的事情可能会干扰UI? 我相信,问题出在显示项目组上——尽管组列表返回正确并且在UI线程上可见。我还可以查看初始选项卡fine,其中包含在RetrieveItems方法中创建的ItemViewModels 我发现这也不可能调试 代码如下:C# MVVM-从BackgroundWorker创建可观察集合-依赖源/对象错误,c#,multithreading,mvvm,backgroundworker,dependency-properties,C#,Multithreading,Mvvm,Backgroundworker,Dependency Properties,我刚刚在我的应用程序中引入了一个加载动画。代码运行,但当我与应用程序接口时,它会崩溃,错误是必须在DependencyObject所在的同一线程上创建DependencySource 我已经修改了代码,以便只有检索和处理数据的调用应该在后台线程上,任何类型的可观察集合都应该在UI线程上初始化 但是,仍然会抛出错误!如果我只是让后台工作人员处理“RetrieveItems”方法,那么它会正常工作,但大多数处理都是在“ApplyFilters”方法中完成的,该方法非常广泛,但最终会返回IItemGr
public void Start()
{
var bgw = new BackgroundWorker();
bgw.DoWork += bgw_DoWork;
bgw.RunWorkerCompleted += bgw_RunWorkerCompleted;
_tabList = GenerateTabs();
DisplayLoadingScreen = true;
bgw.RunWorkerAsync();
}
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
var itemVMs = RetrieveItems(_pciSelectionViewModel.SelectedPcis);
var itemGroups = ApplyFilters(
_pciSelectionViewModel.SelectedPcis, itemVMs,
_pciSelectionViewModel.UserQuestionList, _tabList);
e.Result = Tuple.Create<IEnumerable<IItemViewModel>, IEnumerable<IItemGroupViewModel>>(itemVMs, itemGroups);
}
private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
DisplayLoadingScreen = false;
var res = e.Result as Tuple<IEnumerable<IItemViewModel>, IEnumerable<IItemGroupViewModel>>;
InitialiseObservableCollections(res.Item1, res.Item2);
}
public void InitialiseObservableCollections(IEnumerable<IItemViewModel> itemVMs,
IEnumerable<IItemGroupViewModel> itemGroups)
{
AddAllocatedTabsToItems(itemGroups);
ItemGroupCollection = new ObservableCollection<IItemGroupViewModel>(itemGroups);
PciCollection = new ObservableCollection<IPciViewModel>(_pciSelectionViewModel.SelectedPcis);
TabList = new ObservableCollection<IAnalysisTabViewModel>(_tabList);
ItemCollection = new ObservableCollection<IItemViewModel>(itemVMs);
AssignedTabFiltersCollection = new ObservableCollection<string>(GenerateItemTypeFilters(_tabList));
foreach (var itemGroup in itemGroups)
{
itemGroup.PopulateInternalData(_pciSelectionViewModel.SelectedPcis);
}
_tabList.ToList().ForEach(t => t.Update());
}
若你们的应用程序启动缓慢,现在正试图添加闪屏,那个么更可能的问题是你们忘记了重新设计它。例如,在打开数据库时,您不应该立即通过绑定等方式填充数据。相反,您只需要打开它们并稍后加载数据。或者,如果你考虑预加载,模型中应该有另一个数据层。你的BGWXDOWORK方法中的什么是表?