我有两个线程应该读取文件或创建它(如果尚未存在)。因此,如果第一个已经创建了文件,则第二个应该只读取它而不是重新创建它。
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创建文件线程时,两个执行相同但抛出异常,因为该文件已被第一个文件使用。
如何有效地锁定读写文件?
答案 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);
}
}