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

时间:2010-02-24 20:42:38

标签: c# .net multithreading properties thread-safety

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

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

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

4 个答案:

答案 0 :(得分:3)

具体到你的问题:没有问题。

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

[措辞改变]

答案 1 :(得分:1)

通常,如果属性不引用共享状态,那么它们可以在不同的线程上更新而不会出现问题,即使它们是同一对象的一部分。

答案 2 :(得分:1)

只有当您确定某个属性的更改不会导致另一个属性的更改可能会在另一个线程中更改时,您才可以自由地执行此操作。如果属性没有共享数据,那么很快就会很好用!

答案 3 :(得分:1)

假设“正常”属性 - 例如,自动实现或简单的现场支持:

public class MyClass {
    [ReadOnly]
    public string FileAuthor { get; set; }

    public string MetaDataAuthor { 
       get { return _metaDataAuthor; }
       set {  _metaDataAuthor = value; }
    }
    private string  _metaDataAuthor;
}

不应该有任何与更改不同线程上的值相关的问题。没有必要将写入同步到不同的变量。

然而 - 如果PropertyGrid显示文件属性(如FileAuthor) - 您可能想要同步读取(绑定PropertyGrid)和写入(文件提取)。< / p>