Mono ObservableCollection 是否具有线程关联性?
Does Mono ObservableCollection have thread affinity?
我在文档和其他几个地方看到 Mono System.Collections.ObjectModel.ObservableCollection<T>
是 "not thread-safe"。我明白这意味着我不应该允许我的应用程序同时从多个线程调用 Add()
之类的方法。但我很好奇这是否意味着它具有线程亲和性,如视图。
我很久以前做过 WPF 工作,我记得它在 WPF 中具有线程亲和力,甚至抛出特定异常而没有引发其事件。但我也注意到,当我更新绑定时,Xamarin Forms 似乎会自动将 VM 属性 更改传输到 UI 线程,我认为 WPF 不会那样做。
所以我设置了一个示例 Xamarin.Forms 项目并将 ListView
绑定到 ObservableCollection
。我写了一些代码在 UI 线程上添加一些项目,还有一些代码在工作线程上添加它们。为了进行比较,我还编写了一个从工作线程设置标签文本的方法。两种更新 ObservableCollection 的方法都有效。点击更新标签的按钮会使应用程序崩溃。
这 似乎 证明不存在线程关联,并且 Xamarin Forms 绑定在正确的线程上处理事件。但我也习惯于线程亲和性问题有些不可预测,所以我可以 "getting lucky".
有确定的答案吗?只要我注意单独的同步问题,我可以从任何线程更新绑定的 ObservableCollection 吗?
Mono ObservableCollection 不是线程安全的,但没有线程亲和性,如果以非并发方式从不同线程访问,则不应崩溃。
我在文档和其他几个地方看到 Mono System.Collections.ObjectModel.ObservableCollection<T>
是 "not thread-safe"。我明白这意味着我不应该允许我的应用程序同时从多个线程调用 Add()
之类的方法。但我很好奇这是否意味着它具有线程亲和性,如视图。
我很久以前做过 WPF 工作,我记得它在 WPF 中具有线程亲和力,甚至抛出特定异常而没有引发其事件。但我也注意到,当我更新绑定时,Xamarin Forms 似乎会自动将 VM 属性 更改传输到 UI 线程,我认为 WPF 不会那样做。
所以我设置了一个示例 Xamarin.Forms 项目并将 ListView
绑定到 ObservableCollection
。我写了一些代码在 UI 线程上添加一些项目,还有一些代码在工作线程上添加它们。为了进行比较,我还编写了一个从工作线程设置标签文本的方法。两种更新 ObservableCollection 的方法都有效。点击更新标签的按钮会使应用程序崩溃。
这 似乎 证明不存在线程关联,并且 Xamarin Forms 绑定在正确的线程上处理事件。但我也习惯于线程亲和性问题有些不可预测,所以我可以 "getting lucky".
有确定的答案吗?只要我注意单独的同步问题,我可以从任何线程更新绑定的 ObservableCollection 吗?
Mono ObservableCollection 不是线程安全的,但没有线程亲和性,如果以非并发方式从不同线程访问,则不应崩溃。