Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVVM-从BackgroundWorker创建可观察集合-依赖源/对象错误_C#_Multithreading_Mvvm_Backgroundworker_Dependency Properties - Fatal编程技术网

C# MVVM-从BackgroundWorker创建可观察集合-依赖源/对象错误

C# MVVM-从BackgroundWorker创建可观察集合-依赖源/对象错误,c#,multithreading,mvvm,backgroundworker,dependency-properties,C#,Multithreading,Mvvm,Backgroundworker,Dependency Properties,我刚刚在我的应用程序中引入了一个加载动画。代码运行,但当我与应用程序接口时,它会崩溃,错误是必须在DependencyObject所在的同一线程上创建DependencySource 我已经修改了代码,以便只有检索和处理数据的调用应该在后台线程上,任何类型的可观察集合都应该在UI线程上初始化 但是,仍然会抛出错误!如果我只是让后台工作人员处理“RetrieveItems”方法,那么它会正常工作,但大多数处理都是在“ApplyFilters”方法中完成的,该方法非常广泛,但最终会返回IItemGr

我刚刚在我的应用程序中引入了一个加载动画。代码运行,但当我与应用程序接口时,它会崩溃,错误是必须在DependencyObject所在的同一线程上创建DependencySource

我已经修改了代码,以便只有检索和处理数据的调用应该在后台线程上,任何类型的可观察集合都应该在UI线程上初始化

但是,仍然会抛出错误!如果我只是让后台工作人员处理“RetrieveItems”方法,那么它会正常工作,但大多数处理都是在“ApplyFilters”方法中完成的,该方法非常广泛,但最终会返回IItemGroupViewModel的列表。什么样的事情可能会干扰UI? 我相信,问题出在显示项目组上——尽管组列表返回正确并且在UI线程上可见。我还可以查看初始选项卡fine,其中包含在RetrieveItems方法中创建的ItemViewModels

我发现这也不可能调试

代码如下:

    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方法中的什么是表?