首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何异步读取xml文件?

如何异步读取xml文件?
EN

Stack Overflow用户
提问于 2019-09-03 23:08:47
回答 1查看 220关注 0票数 0

我正在尝试创建一个UWP应用程序,它在启动时会读出xml文件,然后将其内容显示在列表中。我在某种程度上设法创建了一段代码,它应该可以做我想做的事情,但是当我运行应用程序时,它告诉我不应该同步运行它。

我尝试了Youtube和Stackoverflow上的许多建议。就在我发布这篇文章之前,我发现了这个:How to read in an XML file asynchronously?

我相信这让我更近了一步,但还没有。

在教程和上面提到的stackoverflow的帮助下,我得到了以下结果:

代码语言:javascript
复制
    public async Task GetCountriesFromFile()
        {


            XmlReaderSettings settings = new XmlReaderSettings
            {
                Async = true
            };
            XmlReader doc = XmlReader.Create("DummyFilepath/Countries.xml", settings);


            while (await doc.ReadAsync())
            {
                if(doc.NodeType == XmlNodeType.Element && doc.Name == "country")
                {
                    if (doc.HasAttributes)
                    {
                        var c = new Country()
                        {
                            Id = Convert.ToUInt16(doc.GetAttribute("id")),
                            Name = doc.GetAttribute("name"),
                            FromY =     Convert.ToUInt16(doc.GetAttribute("from")),
                            ToY = Convert.ToUInt16(doc.GetAttribute("to"))
                        };

                        Countries.CountriesList.Add(c);
                    }
                }
            }

        }

和我的页面加载事件:

代码语言:javascript
复制
private async void PageLoaded(object sender, RoutedEventArgs e)
        {
            GetCountries getCountries = new GetCountries();
            await getCountries.GetCountriesFromFile();
        }

理想情况下,它发生在页面加载之前,但我想当我使用绑定时,这并不重要。

这现在给我带来了一个错误:

System.InvalidOperationException:“不应在UI线程上执行同步操作。请考虑在Task.Run中包装此方法。”

我该怎么做才能解决这个问题呢?提前感谢

EN

回答 1

Stack Overflow用户

发布于 2019-09-04 15:48:25

如何异步读取

文件?

我检查了你的代码,问题是等待GetCountriesFromFile会阻塞UI线程,因为你没有在GetCountriesFromFile方法中创建新的子线程。我已经编辑了你的代码,请参考以下内容。

代码语言:javascript
复制
public async Task GetCountriesFromFile()
{
    await Task.Run(async () =>
    {
        XmlReaderSettings settings = new XmlReaderSettings
        {
            Async = true
        };

        var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/Countries.xml"));
        using (var stream = await file.OpenStreamForReadAsync())
        {   
            XmlReader doc = XmlReader.Create(stream, settings);
            while (await doc.ReadAsync())
            {
                if (doc.NodeType == XmlNodeType.Element && doc.Name == "country")
                {
                    if (doc.HasAttributes)
                    {
                        var c = new Country()
                        {
                            Id = Convert.ToUInt16(doc.GetAttribute("id")),
                            Name = doc.GetAttribute("name"),
                            FromY = Convert.ToDouble(doc.GetAttribute("from")),
                            ToY = Convert.ToDouble(doc.GetAttribute("to"))
                        };

                    }
                }
            }
        }

    });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57774440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档