【发布时间】:2016-03-06 20:44:00
【问题描述】:
在模型视图控制器(或模型视图视图-控制器)设计模式中,数据源和 UI 有单独的线程是很常见的。例如,假设有问题的应用程序是蓝牙 LE 温度计读取器。很自然的做法是让一个线程异步地从温度计获取数据,同时 UI 线程更新屏幕上的读数。
现在想象一个可以从一堆温度计中提取数据的应用。将Temperature 和Battery Level 之类的东西包装到一个类中并将每个连接的设备作为该Thermometer 类的新实例是有意义的。但由于数据是从蓝牙设备异步到达每个设备的,因此 UI 线程可以在更新值时读取 Thermometer 的属性。
所以总的来说,在我看来,如果您的数据源位于与业务逻辑不同的线程上,每个访问器(get、set 等)都应该使用锁。这是真的?还是公共访问器中内置了一些线程安全性?如果没有,那么对每个 get/set 方法实施锁定似乎非常乏味,更不用说对于大型数据源效率低下。
【问题讨论】:
-
锁定单个属性几乎总是错误的,因为它不能保证数据的一致性。您需要考虑您的应用程序中的“数据片段”意味着什么,并确保每次访问它时都以一致的方式完成。请注意,使用不可变数据结构使得考虑多线程代码更容易(不容易),因为一旦创建此类对象就不会改变,因此始终保持一致且线程安全。
标签: c# multithreading thread-safety