同时修改来自不同任务的XML

时间:2014-07-13 11:58:18

标签: c# asp.net xml winforms

我尝试使用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>

2 个答案:

答案 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就可以了。