Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 锁定属性get/set_C#_.net - Fatal编程技术网

C# 锁定属性get/set

C# 锁定属性get/set,c#,.net,C#,.net,如果以下代码是安全的,则多个线程正在访问属性,但没有写入特定对象。正在创建和指定新对象。多线程调用CreateXmlDoc和ReadXmlDoc public class DataHolder { public XmlDocument XmlDoc {get; set;} } public class AccessClass { DataHolder dataHolderInstance; public AccessClass(DataHolder _dataHold

如果以下代码是安全的,则多个线程正在访问属性,但没有写入特定对象。正在创建和指定新对象。多线程调用
CreateXmlDoc
ReadXmlDoc

public class DataHolder
{
    public XmlDocument XmlDoc {get; set;}
}

public class AccessClass
{
    DataHolder dataHolderInstance;

    public AccessClass(DataHolder _dataHolder)
    {
        dataHolderInstance = _dataHolder;
    }

    private void CreateXmlDoc()
    {
        XmlDocument _xmlDoc = new XmlDocument();
        dataHolderInstance.XmlDoc = _xmlDoc;
    }

    private void ReadXmlDoc()
    {
        XmlNodeList elemList = dataHolderInstance.XmlDoc.GetElementsByTagName("title");
    }

}

xml文档不是线程安全的。 要使此代码线程安全,请执行以下操作:

public class DataHolder
{
    object lockObj = new object();
    private XmlDocument _xmlDoc;
    public XmlDocument XmlDoc
    { 
      get{return GetXmlDoc();}
      set{SetXmlDoc(value);}
    }

    private XmlDocument GetXmlDoc()
    {
       lock(lockObj) return _xmlDoc;
    }

    private void SetXmlDoc(XmlDocument xmlDoc)
    {
       lock(lockObj) _xmlDoc = xmlDoc;
    }
}

public class AccessClass
{
    DataHolder dataHolderInstance;

    public AccessClass(DataHolder _dataHolder)
    {
        dataHolderInstance = _dataHolder;
    }

    private void CreateXmlDoc()
    {
        XmlDocument _xmlDoc = new XmlDocument();
        dataHolderInstance.XmlDoc = _xmlDoc;
    }

    private void ReadXmlDoc()
    {
        XmlNodeList elemList = dataHolderInstance.XmlDoc.GetElementsByTagName("title");
    }
 }

从纯技术角度来看,您上面提供的代码不会出现任何线程安全问题(即数据损坏等)。。您必须问自己的问题是,从功能的角度来看,需要什么样的“线程安全”行为。

access类中初始化的数据持有者实例在哪里?它是在访问类之间共享的吗?请重新措辞。多线程是否调用
CreateXmlDoc
?如果是的话。。那么不,它不是线程安全的。@SimonWhitehead是多线程调用
CreateXmlDoc
我不确定是否有人可以评论这段代码是否是线程安全的,但我不知道并发读写操作所需的语义。我发布了一个答案,使其成为“线程安全的”。我建议你使用它,看看会发生什么。