异步XML文件写入C#

异步XML文件写入C#,c#,xml,multithreading,C#,Xml,Multithreading,我想读写一个已经存在的XML文件,我想让它在另一个线程中读写,这样在读写文件时主ui线程就不会被阻塞 private Event ReadXMLFile() { String workingDir = Directory.GetCurrentDirectory(); xmlDoc = XDocument.Load("Data.xml"); var event = (from item in xmlDoc.Descendants("Event") wher

我想读写一个已经存在的XML文件,我想让它在另一个线程中读写,这样在读写文件时主ui线程就不会被阻塞

private Event ReadXMLFile()
{
  String workingDir = Directory.GetCurrentDirectory();

   xmlDoc = XDocument.Load("Data.xml");
   var event = (from item in xmlDoc.Descendants("Event")
            where item.Element("id").Value == id
            select new Event
            {
                id = item.Element("id").Value,
                title = item.Element("title").Value,
                Start = DateTime.Parse(item.Element("start").Value),
                End = DateTime.Parse(item.Element("end").Value),
                contacts = item.Element("contacts").Elements("contact").Select(c => new Contact
                {
                    Id = c.Element("id").Value,
                    Name = c.Element("name").Value
                }).ToList()
            }).FirstOrDefault();

  return event;
}

private async void button1_Click(object sender, EventArgs e)
{
   this.button1.Enabled = false;
   Event t = await Task.Run(() => this.ReadXMLFile());
   this.button1.Enabled = true;
}
我现在是这样做的。有没有更好的方法来实现这一点

我现在是这样做的。有没有更好的方法来实现这一点

不,你做得对。当XDocument.LoadAsync存在时,您可以如下方式加载XML:

static async Task<XDocument> LoadXmlAsync(string path)
{
    using (var file = System.IO.File.OpenRead(path))
    {
        var doc = await XDocument.LoadAsync(file, LoadOptions.None, System.Threading.CancellationToken.None);
        return doc;
    }
}
静态异步任务LoadXmlAsync(字符串路径)
{
使用(var file=System.IO.file.OpenRead(path))
{
var doc=await XDocument.LoadAsync(文件,LoadOptions.None,System.Threading.CancellationToken.None);
退货单;
}
}

除了XML解析之外,您还有大量的工作要做。因此,使用Task.Run和同步方法将把所有工作转移到后台线程。

您可以使用
ReadAsync
。您只需要执行
任务。如果您正在执行CPU密集型代码,请运行
。该代码除了读取文档中的第一个节点,然后关闭它之外,不会执行任何操作。你想达到什么目的?@DavidBrowne Microsoft我刚刚用已经发布的完整代码更新了这个问题used@RasheenRuwisha现在这是一个完全不同的问题!而且它对数据仍然没有任何作用。这只会浪费回答者的时间在任何情况下,
XDocument
也有一个
LoadAsync
。谢谢你,我会将文件加载改为这个方法!