【发布时间】:2013-09-25 12:30:22
【问题描述】:
我创建了一个小型 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;
}
}
}
}
【问题讨论】:
-
SearchFiles需要在Task内完成。目前它不是异步的。 -
可能是
xmlDoc.Load使应用程序冻结?这会冻结多长时间? -
是的,正如@sam 在
Task<T>中指出的SearchFiles并继续使用 Ui 线程将是适当的 -
我在这里看不到任何异步。使用
await意味着“阻止直到我得到结果”。await在整个代码中乱扔垃圾。因此为什么会阻塞。 -
@SimonWhitehead:
await实际上 必须 用于“一直向上”调用堆栈以使其行为正常 - 它有点“增长”通过代码库.如果您遇到阻塞的情况,那么您应该发布一个问题,因为它当然不应该这样做。 :)
标签: c# xml asynchronous xmlreader