C#线程安全(特别是MVVM/WPF)

And*_*ens 3 c# wpf mvvm

我想知道我需要做些什么来使MVVM中的模型线程安全.假设我有以下类,它被实例化为单例:

public class RunningTotal: INotifyPropertyChange
{
   private int _total;
   public int Total
   {
      get { return _total; }
      set
      {
         _total = value;
         PropertyChanged("Total");
      }
   }
   ...etc...
}
Run Code Online (Sandbox Code Playgroud)

我的视图模型通过属性公开它:

public RunningTotal RunningTotal { get; }
Run Code Online (Sandbox Code Playgroud)

我的观点有一个绑定它的文本块,即{Binding Path=RunningTotal.Total}.

我的应用程序有一个后台线程,定期更新Total的值.假设没有其他任何更新总计,我应该做什么(如果有的话)使所有这些线程安全?

现在,如果我想做类似的事情,但使用类型的属性Dictionary<>,或者ObservableCollection<>?哪些成员(添加,删除,清除,索引器)是线程安全的?我应该使用ConcurrentDictionary吗?

Tho*_*que 8

我的应用程序有一个后台线程,定期更新Total的值.假设没有其他任何更新总计,我应该做什么(如果有的话)使所有这些线程安全?

对于标量属性,您不需要做任何特殊的事情; 该PropertyChanged事件自动封送到UI线程.

现在,如果我想做类似的事情,但使用Dictionary <>或ObservableCollection <>类型的属性怎么办?哪些成员(添加,删除,清除,索引器)是线程安全的?我应该使用ConcurrentDictionary吗?

不,这不是线程安全的.如果ObservableCollection<T>从后台线程更改an的内容,它将会中断.您需要在UI线程上执行此操作.一种简单的方法是使用一个在UI线程上引发事件的集合,就像这里描述的那样.

至于Dictionary<TKey, TValue>,当内容发生变化时,它不会发出通知,因此无论如何都不会通知用户界面.

  • @Coding Gorilla:请参阅[MS Connect文章](http://connect.microsoft.com/VisualStudio/feedback/details/624517/binding-should-check-for-cross-thread-calls).它证实了托马斯声称绑定被自动编组的声明. (3认同)
  • 如何将"PropertyChanged"自动封送到UI线程?魔术在哪里?我希望事件发生在它被解雇的环境中. (2认同)