C#线程安全(特别是MVVMWPF)

C#线程安全(特别是MVVMWPF),第1张

概述我想知道我需要做些什么来使MVVM中的模型线程安全.假设我有以下类,它被实例化为单例: public class RunningTotal: INotifyPropertyChange{ private int _total; public int Total { get { return _total; } set { _ 我想知道我需要做些什么来使MVVM中的模型线程安全.假设我有以下类,它被实例化为单例:

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

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

public RunningTotal RunningTotal { get; }

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

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

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

解决方法

My app has a background thread that periodically updates the value of Total. Assuming nothing else updates Total,what (if anything) should I do to make all this thread-safe?

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

Now,what if I wanted to do something similar but using a property of type Dictionary<>,or ObservableCollection<>? Which members (add,remove,clear,indexer) are thread-safe? Should I use a ConcurrentDictionary instead?

不,这不是线程安全的.如果您更改ObservableCollection的内容< T>从后台线程,它将打破.您需要在UI线程上执行此 *** 作.一种简单的方法是使用一个在UI线程上引发事件的集合,如here所述.

对于Dictionary< TKey,TValue>,当其内容发生变化时,它不会发出通知,因此无论如何都不会通知UI.

总结

以上是内存溢出为你收集整理的C#线程安全(特别是MVVM / WPF)全部内容,希望文章能够帮你解决C#线程安全(特别是MVVM / WPF)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1222215.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存