我尝试使用Tasks在XML文件上运行并发读写操作。当我使用下面的FileStream
解决方案时,新的XML文档会附加到当前,而不仅仅是item
。在每次新插入之前是否需要清除文档?或者我是否需要查看异步XML API?
简化示例:
public static void AddTestElement()
{
XDocument doc = XDocument.Load(FilePath);
XElement item = new XElement("item", "text");
XElement xmlroot = doc.Element("root");
if (xmlroot != null)
{
xmlroot.Add(item);
//doc.Save(FilePath); <-- this works, but locks the file
using (FileStream fs = new FileStream(FilePath,
FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
{
doc.Save(fs);
}
}
}
使用:
调用Task.Factory.StartNew(AddTestElement);
在:
<?xml version="1.0" encoding="utf-8"?>
<root>
<item>text</item>
</root>
后:
<?xml version="1.0" encoding="utf-8"?>
<root>
<item>text</item>
</root>
<?xml version="1.0" encoding="utf-8"?>
<root>
<item>text</item>
<item>text</item>
</root>
答案 0 :(得分:2)
附加:打开文件(如果存在)并搜索到文件末尾,或创建新文件。
创建:指定操作系统应创建新文件。如果该文件已存在,则将被覆盖。
在此将覆盖您的文件内容
CreateNew:指定操作系统应创建新文件。 尝试以下解决方案
static void Main(string[] args)
{
ProcessWrite().Wait();
Console.Write("Done ");
Console.ReadKey();
}
static Task ProcessWrite()
{
string filePath = @"C:\Users\Srikanth\Desktop\sample.xml";
return WriteTextAsync(filePath);
}
static async Task WriteTextAsync(string FilePath)
{
XDocument doc = XDocument.Load(FilePath);
XElement item = new XElement("item", "text");
XElement xmlroot = doc.Element("root");
if (xmlroot != null)
{
xmlroot.Add(item);
//doc.Save(FilePath); <-- this works, but locks the file
using (FileStream fs = new FileStream(FilePath,
FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
{
doc.Save(fs);
}
}
}
答案 1 :(得分:1)
它与Task
无关。这是因为你已经将FileMode.Append
传递给了FileStream
的constructoe。只需使用FileMode.Create
就可以了。