c# - 允许两个线程同时编辑同一对象的不同属性是否安全?

标签 c# .net multithreading properties thread-safety

我正在编写一个编目应用程序,它解析文件并从中提取信息,并将每个文件的信息存储在一个对象实例中。除了从文件中提取的数据外,对象还具有其他元数据属性(作者、标签、注释等),这些属性随后会存储在单独的 XML 文件中。

从文件中提取数据是一个耗时的过程,所以我让它在一个单独的线程上运行。从文件中提取的属性只会来自文件,因此具有 [ReadOnly] 属性以防止用户编辑它们。另一方面,元数据属性仅由用户填充,因此不是只读的。我允许用户通过 PropertyGrid 查看/编辑这些对象。

因此,如果提取过程在填充对象文件属性的一个线程上运行,那么让用户同时编辑元数据属性是否有任何危险?我正在尝试决定是应该使用模态界面来阻止用户在提取完成/取消之前做任何事情,还是应该使用非模态界面来允许他们在提取运行时继续工作。

最佳答案

具体到您的问题:不,没有问题。

您应该注意的是,后台线程写入的属性在写入时不会从 UI 线程中读取。如果你不能保证这一点,你必须要么使用锁,要么将写入编码到 UI 线程。 (使用 control.Invoke()BackgroundWorker 或者,确保写入是指向对象的指针的原子写入,该对象未被后台线程编辑,但从 UI 线程可见。我不认为像 List<T> 这样的标准容器是线程安全。

[措辞改变]

关于c# - 允许两个线程同时编辑同一对象的不同属性是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2329348/

相关文章:

c# - 获取所有打开的窗口

c# - AutoMapper 条件实体映射

c# - Flurl PostUrlEncoded 使用 GET 而不是 POST

c# - 如何编码指向包含无符号字符数组的结构数组的指针?

.net - 基于 session 的网络服务

java - 通过 Nexmo API 将回调 URL 分配给短信号码

c# - 多线程和串行端口

c# - 委托(delegate)、操作和传递 lambda 表达式作为委托(delegate)参数

c# - 如何过滤作为类事件底层实现的 FieldInfo?

android - 我可以获得非阻塞 Looper 吗?