我想知道我需要做些什么来使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吗?
我的应用程序有一个后台线程,定期更新Total的值.假设没有其他任何更新总计,我应该做什么(如果有的话)使所有这些线程安全?
对于标量属性,您不需要做任何特殊的事情; 该PropertyChanged事件自动封送到UI线程.
现在,如果我想做类似的事情,但使用Dictionary <>或ObservableCollection <>类型的属性怎么办?哪些成员(添加,删除,清除,索引器)是线程安全的?我应该使用ConcurrentDictionary吗?
不,这不是线程安全的.如果ObservableCollection<T>从后台线程更改an的内容,它将会中断.您需要在UI线程上执行此操作.一种简单的方法是使用一个在UI线程上引发事件的集合,就像这里描述的那样.
至于Dictionary<TKey, TValue>,当内容发生变化时,它不会发出通知,因此无论如何都不会通知用户界面.