c#如何从xmlReader异步返回xml结果
我最近开始使用async和Wait方法——我设法阅读HTML页面并在网格中显示结果 我现在的目标是在阅读XML文档时做同样的事情。在我的代码中单步执行时,它似乎是有效的,但当找到结果时,结果不会传递到前端[即使它在后台获得结果] 在做了一些研究之后,我怀疑我可能需要以下方面的东西:c#如何从xmlReader异步返回xml结果,c#,xml,asynchronous,return,C#,Xml,Asynchronous,Return,我最近开始使用async和Wait方法——我设法阅读HTML页面并在网格中显示结果 我现在的目标是在阅读XML文档时做同样的事情。在我的代码中单步执行时,它似乎是有效的,但当找到结果时,结果不会传递到前端[即使它在后台获得结果] 在做了一些研究之后,我怀疑我可能需要以下方面的东西: Task.Factory.StartNew(() => Load(xml)); 而不是我现在的: while (await xmlReader.ReadAsync()) 但我一点也不确定——或者,可能是我没
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;
}
}
//更新前端
私有异步无效按钮4\u单击(对象发送方,事件参数e)
{
var res=await doXml();
foreach(在res中的var r)
{
l1\u table.Rows.Add(r.url\u、r.lastMod\u、r.priority\u);
}
}
//异步读取和处理XML
公共异步任务doXml()
{
列表=新列表();
bool-isLoc=false;
bool isLastMod=false;
bool isPriority=false;
字符串url=“”;
字符串lastMod=“”;
字符串优先级=”;
使用(XmlReader=XmlReader.Create(“myXmlUrl”,新的XmlReaderSettings(){Async=true}))
{
while(等待xmlReader.ReadAsync())
{
开关(xmlReader.NodeType)
{
case XmlNodeType.Element:
开关(xmlReader.Name)
{
//检查当前元素名称
案例“loc”:
isLoc=真;
isLastMod=false;
isPriority=false;
打破
案例“lastmod”:
isLoc=false;
isLastMod=真;
isPriority=false;
打破
案例“优先权”:
isLoc=false;
isLastMod=false;
isPriority=true;
打破
违约:
打破
}
打破
案例XmlNodeType.Text:
//从元素中提取文本值
如果(isLoc)
{
url=xmlReader.Value;
}
如果(isLastMod)
{
lastMod=xmlReader.Value;
}
如果(优先级)
{
//始终是结构中的最后一个元素
优先级=xmlReader.Value;
//将结果添加到列表中
xmlLocs lc=newxmllocs(){url_u=url,lastMod_=lastMod,priority_=priority};
增加(信用证);
//??也许还有另一种方法可以退回这个???
}
打破
违约:
打破
}
}
//退货清单?
退货清单;
}
}
我正在读取的文件的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>
地点123
2016-02-15
56
地点555
2016-11-22
80
提前谢谢
C Bass我认为不能将Async与XML一起使用,因为Async不会在尖括号内终止并导致异常。我认为不能将Async与XML一起使用,因为Async不会在尖括号内终止并导致异常。