如果线程中不存在文件,则创建文件
本文关键字:文件 创建 不存在 线程 如果 | 更新日期: 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);
}
}