Multithreading 实现INotifyPropertyChanged的IDictionary实现必须是线程安全的吗?

Multithreading 实现INotifyPropertyChanged的IDictionary实现必须是线程安全的吗?,multithreading,xamarin.ios,xamarin.android,inotifypropertychanged,concurrentdictionary,Multithreading,Xamarin.ios,Xamarin.android,Inotifypropertychanged,Concurrentdictionary,我正在寻找一个可观察的字典,我想与Xamarin.iOS/Android一起使用。有一些评论和答案表明并发性不是一个问题 一般来说,在处理实现INotifyPropertyChanged的对象时,我应该依赖哪些线程安全保证 换言之: 当从UI线程使用可观察字典时,该对象是否也必须是线程安全的 如果字典没有在UI线程上管理怎么办 我正在考虑另一种实现方式 一般来说,在处理实现INotifyPropertyChanged的对象时,我应该依赖哪些线程安全保证 当一个对象实现INotifyPropert

我正在寻找一个可观察的字典,我想与Xamarin.iOS/Android一起使用。有一些评论和答案表明并发性不是一个问题

一般来说,在处理实现INotifyPropertyChanged的对象时,我应该依赖哪些线程安全保证

换言之:

当从UI线程使用可观察字典时,该对象是否也必须是线程安全的

如果字典没有在UI线程上管理怎么办

我正在考虑另一种实现方式

一般来说,在处理实现INotifyPropertyChanged的对象时,我应该依赖哪些线程安全保证

当一个对象实现INotifyPropertyChanged接口时,其成员PropertyChanged(用于拦截属性更改操作的事件处理程序)应该在我们的代码中实现,然后我们还需要创建方法/函数来处理此事件,从而确保在操作此对象时多个线程不会冲突。例如:

公共类Test1:INotifyPropertyChanged { 私有字符串测试; 公共字符串测试 { 获取{return\u test;} 设置 { 如果值!=\u测试 { _测试=数值; 不动产变更; } } } 公共事件属性更改事件处理程序属性更改; 私有void OnPropertyChanged[CallerMemberName]字符串propertyName= { 如果this.PropertyChanged!=null { PropertyChanged此,新PropertyChangedEventArgspropertyName; } } } 现在的问题是PropertyChanged事件如何保证它的安全,如果您使用ILSpy检查的源代码,您会发现在它内部,它只实现了一个委托PropertyChanged,委托如下所示:

使用制度; 使用System.Security.Permissions; 命名空间System.ComponentModel { ///表示在组件上更改属性时将处理引发的事件的方法。 ///事件的来源。 ///包含事件数据的。 [[uuuu动态调用可禁用] [HostProtectionSecurityAction.LinkDemand,SharedState=true] 公共委托无效PropertyChangedEventHandlerobject发送者,PropertyChangedEventArgs e; } 您应该能够发现此委托上方有一个HostProtection属性,该属性允许使用声明性安全操作来确定主机保护要求。在这个HostProtectionAttribute:CodeAccessSecurityAttribute的实现中,它创建线程同步锁。以下是它的部分代码:

///获取或设置一个值,该值指示是否公开同步。 ///如果同步被公开,则为true;否则,错误。默认值为false。 公共布尔同步 { 收到 { 返回this.m_resources&HostProtectionResource.Synchronization>HostProtectionResource.None; } 设置 { this.m_resources=value?this.m_resources | HostProtectionResource.Synchronization:this.m_resources&~HostProtectionResource.Synchronization; } } ///获取或设置一个值,该值指示是否公开共享状态。 ///如果共享状态是公开的,则为true;否则,错误。默认值为false。 公共资产共享状态 { 收到 { 返回this.m_resources&HostProtectionResource.SharedState>HostProtectionResource.None; } 设置 { this.m_resources=value?this.m_resources | HostProtectionResource.SharedState:this.m_resources&~HostProtectionResource.SharedState; } } 关于你的问题:

当从UI线程使用可观察字典时,该对象是否也必须是线程安全的

如果字典没有在UI线程上管理怎么办


在UI线程中,如果代码中没有跨线程变量访问,那么它是安全的,否则,这将导致不安全。当不在UI线程中时,我们需要使用invoke way UI Dispatcher将操作推送到UI线程。

我想使用字典收集通过蓝牙发送给我的对象。然后,我将使用Rx和等效的计时器扫描和清理该字典。如果这不在UI线程中,除了使用并发字典之外,我应该做些什么来维护事件的安全性?对于这个用例,我还应该看些什么吗?@LamonteCristo,实现INotifyPropertyChanged接口的use collection在任何线程中都应该是安全的,正如我所说的,如果它在其他线程中,并且您想在UI线程中使用它,那么可以使用UI调度程序,这是一种安全的方法。但是从你的描述来看,你的目标是通过串口连接到Android设备的蓝牙附件吗?我将有许多不同的线程来监听P2P Wifi、BTLe、互联网推送通知和NFC。平台为iOS Android和有限WinPho 氖。所有这些都会将信息推送到带有日期戳的词典中。维护线程将对数据进行汇总和老化/归档。出于调试目的,数据将显示在TableView中