我最近开始使用async和await方法 - 我想要阅读HTML页面并在网格中显示我的结果。
我现在的目标是在阅读XML文档时做同样的事情。当单步执行我的代码时,它似乎有效,但结果不会传递到前端,当结果被发现时[即使它在后台得到结果]
在做了一些研究之后,我怀疑我可能需要以下内容:
Task.Factory.StartNew(() => Load(xml));
而不是我目前的:
while (await xmlReader.ReadAsync())
但我完全不确定 - 或者,是不是我没有以正确的方式返回结果以便及时处理?
这是我目前的代码:
// To Update Frontend
private async void button4_Click(object sender, EventArgs e)
{
var res = await doXml();
foreach (var r in res)
{
l1_table.Rows.Add(r.url_, r.lastMod_, r.priority_);
}
}
//To read and Process XML Async
public async Task<List<xmlLocs>> doXml()
{
List<xmlLocs> list = new List<xmlLocs>();
bool isLoc = false;
bool isLastMod = false;
bool isPriority = false;
string url = "";
string lastMod = "";
string priority = "";
using (XmlReader xmlReader = XmlReader.Create("myXmlUrl", new XmlReaderSettings() { Async = true }))
{
while (await xmlReader.ReadAsync())
{
switch (xmlReader.NodeType)
{
case XmlNodeType.Element:
switch (xmlReader.Name)
{
//check current element name
case "loc":
isLoc = true;
isLastMod = false;
isPriority = false;
break;
case "lastmod":
isLoc = false;
isLastMod = true;
isPriority = false;
break;
case "priority":
isLoc = false;
isLastMod = false;
isPriority = true;
break;
default:
break;
}
break;
case XmlNodeType.Text:
//extract text value from element
if (isLoc)
{
url = xmlReader.Value;
}
if (isLastMod)
{
lastMod = xmlReader.Value;
}
if (isPriority)
{
//always last element in structure
priority = xmlReader.Value;
//add result to list
xmlLocs lc = new xmlLocs() { url_ = url, lastMod_ = lastMod, priority_ = priority };
list.Add(lc);
//??? Maybe another way to return this ???
}
break;
default:
break;
}
}
//return list ?
return list;
}
}
我正在阅读的文件的Xml结构:
<url>
<loc>Location 123</loc>
<lastmod>2016-02-15</lastmod>
<priority>56</priority>
</url>
<url>
<loc>Location 555</loc>
<lastmod>2016-11-22</lastmod>
<priority>80</priority>
</url>
提前致谢 C巴斯