【问题标题】:How do you read xml file asynchronous?你如何异步读取xml文件?
【发布时间】:2019-09-04 15:48:24
【问题描述】:

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

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

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

在教程和上面提到的 stackoverflow 的帮助下,我得到了这个:

    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);
                    }
                }
            }

        }

和我的页面加载事件:

private async void PageLoaded(object sender, RoutedEventArgs e)
        {
            GetCountries getCountries = new GetCountries();
            await getCountries.GetCountriesFromFile();
        }

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

这现在给我一个错误:

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

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

【问题讨论】:

  • 我相信这个警告给了你足够的信息。您是否尝试过将 PageLoaded 指令包装在 Task.Run() 中?
  • @Littledoe 我试过了,但它给了我一个不同的错误。我现在做了更多研究,发现它必须看起来像这样 Task.Run(() => function);我认为他们最好指定这一点。我现在确实收到另一个错误:我对文件的访问被拒绝。我正在逃避反斜杠,我正在以管理员身份运行 VS。该文件不是只读的。还有什么问题?
  • 用即发即弃的方法替换第二行怎么样? _ = GetCountriesFromFile()
  • @littledoe 你的意思是这样吗?:await Task.Run(() => _ = getCountries.GetCountriesFromFile());这给了我同样的错误。
  • 在这种情况下你不必包装它。

标签: xml asynchronous uwp onload


【解决方案1】:

如何异步读取xml文件?

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

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"))
                        };

                    }
                }
            }
        }

    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2021-08-07
    • 2019-01-13
    相关资源
    最近更新 更多