如果线程中不存在则创建文件

时间:2016-07-04 08:05:25

标签: c# multithreading locking

我有两个线程应该读取文件或创建它(如果尚未存在)。因此,如果第一个已经创建了文件,则第二个应该只读取它而不是重新创建它。

private void TransformCatalogue(ref XmlReader reader)
{
    var xsltDoc = new XmlDocument();
    xsltDoc.Load("myXsltFile.xsl"));
    XsltSettings xsltSettings = new XsltSettings(false, true);
    var transformer = new XslCompiledTransform();
    transformer.Load(xsltDoc, xsltSettings, new XmlUrlResolver());

    var newCatalogue = "transformed.xml";
    if (!File.Exists(newCatalogue))
    {
        using (var stream = new FileStream(newCatalogue, FileMode.Create))
        transformer.Transform(this.catalogFile, new XsltArgumentList(), stream);
    }

    reader.Close();
    reader = XmlReader.Create(newCatalogue);
}

调用代码:

var root = new XmlDocument();
lock (root)
{
    root.Load(reader);
    if (root.DocumentElement.Name == "FC_FeatureCatalogue")
        TransformCatalogue(ref reader);
}
afc = (AC_FeatureCatalogueType)ser.Deserialize(reader);

然而,两个线程似乎并行访问锁而不是顺序访问。因此,当线程1创建文件线程时,两个执行相同但抛出异常,因为该文件已被第一个文件使用。

如何有效地锁定读写文件?

1 个答案:

答案 0 :(得分:0)

我是通过在我的班级中创建一个静态锁定对象来实现的:

class MyClass
{    
    static _lockObject = new Object();

    void MyMethod()
    {
        var root = new XmlDocument();
        lock (_lockObject )
        {
            root.Load(reader);
            if (root.DocumentElement.Name == "FC_FeatureCatalogue")
                TransformCatalogue(ref reader);
        }
        afc = (AC_FeatureCatalogueType)ser.Deserialize(reader);           
    }
}