C# 我可以在后台线程中创建或填充ViewModels和ObservableCollection吗?

C# 我可以在后台线程中创建或填充ViewModels和ObservableCollection吗?,c#,wpf,multithreading,mvvm,C#,Wpf,Multithreading,Mvvm,我有一个MVVM(C#/WPF)应用程序,希望在后台线程中创建和填充我的ViewModels(使用INotifyPropertyChange)和ObservableCollections 如果我这样做,我会得到一个异常:“必须在与DependencyObject相同的线程上创建DependencySource。” 我知道如何使用Dispatcher在UI线程中移动操作。但我不清楚什么必须转移到UI线程。我有以下5个案例 var vm=new ViewModel();//实现INotifyProp

我有一个MVVM(C#/WPF)应用程序,希望在后台线程中创建和填充我的ViewModels(使用INotifyPropertyChange)和ObservableCollections

如果我这样做,我会得到一个异常:“必须在与DependencyObject相同的线程上创建DependencySource。”


我知道如何使用Dispatcher在UI线程中移动操作。但我不清楚什么必须转移到UI线程。我有以下5个案例

  • var vm=new ViewModel();//实现INotifyPropertyChange
  • vm.Name=“Name”//激发属性更改
  • var oc=newobserveCollection()
  • oc.Add(vm)
  • var oc2=新的ObservableCollection(列表);//而列表是ViewModel的列表

  • 您不能在非
    调度程序
    线程上调用
    ObservableCollection.Add()

    您可以在非
    调度程序
    线程上创建
    可观察收集

    只要构造函数中没有任何
    Dispatcher
    -仅调用,那么在哪个线程上创建
    ViewModel
    对象并不重要

    更新有关PropertyChanged事件的评论:

    您需要在
    Dispatcher
    线程上引发
    PropertyChanged
    事件,以便对其进行处理。我发现在这些情况下,将事件的引发包装在
    Dispatcher.Invoke()
    调用中非常有用

    针对具体案例的答案更新

    • 情况1:可以在任何线程上,只要构造函数中没有特定于
      的调用
      
    • 案例2:如果希望事件由任何绑定控件处理,则应在
      Dispatcher
      上引发
    • 案例3:可以在任何线程上
    • 案例4:必须在
      调度程序上
    • 案例5:可以在任何线程上

    “我不清楚什么东西必须移动到UI线程”:从引发异常的任何东西开始。我认为,如果在后台线程上修改对象之前先删除对象,就可以这样做。“我有以下5个案例”-这是什么意思。使用后台线程的代码在哪里?抛出错误的是哪一行?这些行中的任何一行都不会直接抛出异常。它是由“消费代码”抛出的,所以案例1(具有空构造函数)可以在非调度程序线程中运行,而案例2必须在调度程序线程中运行?而PropertyChange()是一个仅调度程序调用吗?