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

本文关键字:文件 创建 不存在 线程 如果 | 更新日期: 2023-09-27 17:54:21

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

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创建文件时,线程2做同样的事情,但抛出异常,因为文件已经被第一个线程使用。

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

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

我通过在我的类中创建一个静态锁对象来获得它:

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);           
    }
}