c#如何从xmlReader返回xml结果async

时间:2016-11-29 16:54:52

标签: c# xml asynchronous return

我最近开始使用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巴斯

0 个答案:

没有答案