Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#如何从xmlReader异步返回xml结果_C#_Xml_Asynchronous_Return - Fatal编程技术网

c#如何从xmlReader异步返回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()) 但我一点也不确定——或者,可能是我没

我最近开始使用async和Wait方法——我设法阅读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;
        }
    }
//更新前端
私有异步无效按钮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不会在尖括号内终止并导致异常。