我创建了一个小型C#应用程序,它应该异步地从XML文件中提取所有值。问题是..它不是异步的,我无法看到我出错的地方。单击按钮时,UI冻结,应用程序无法移动等,显示它同步运行的所有迹象。
有人能看出为什么会这样吗?
private async void parseAndExportBtn_Click(object sender, EventArgs e)
{
progressBar1.MarqueeAnimationSpeed = 100;
parseAndExportBtn.Enabled = false;
selectDirectoryBtn.Enabled = false;
status.Text = "Started searching files...";
await SearchFiles(selectTxcDirectory.SelectedPath);
status.Text = "Finished searching files";
}
private static async Task SearchFiles(string path)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(path + "/cen_18-2_-1-y11.xml");
using (XmlReader r = XmlReader.Create(new StringReader(xmlDoc.InnerXml), new XmlReaderSettings() { Async = true }))
{
while (await r.ReadAsync())
{
switch (r.NodeType)
{
case XmlNodeType.Text:
Console.WriteLine(await r.GetValueAsync());
break;
}
}
}
}
答案 0 :(得分:4)
在SearchFiles(string path)
中致电Task
。如下所示。
private void parseAndExportBtn_Click(object sender, EventArgs e)
{
progressBar1.MarqueeAnimationSpeed = 100;
parseAndExportBtn.Enabled = false;
selectDirectoryBtn.Enabled = false;
status.Text = "Started searching files...";
Task t = Task.Run(() => SearchFiles(selectTxcDirectory.SelectedPath));
status.Text = "Finished searching files";
}
我建议您async
和await
个关键字read this article。
答案 1 :(得分:3)
我猜这个问题是由同步加载的XmlDocument.Load
引起的。
尝试使用从异步文件流创建的XmlReader
。
using (var file = new FileStream(path + "/cen_18-2_-1-y11.xml", FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true))
using (XmlReader r = XmlReader.Create(file, new XmlReaderSettings() { Async = true }))
{
while (await r.ReadAsync())
{
switch (r.NodeType)
{
case XmlNodeType.Text:
Console.WriteLine(await r.GetValueAsync());
break;
}
}
}