异步XML文件写入C#
我想读写一个已经存在的XML文件,我想让它在另一个线程中读写,这样在读写文件时主ui线程就不会被阻塞异步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
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
。谢谢你,我会将文件加载改为这个方法!