我正在尝试创建一个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中包装此方法。”
我该怎么做才能解决这个问题呢?提前感谢
发布于 2019-09-04 15:48:25
如何异步读取
文件?
我检查了你的代码,问题是等待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"))
};
}
}
}
}
});
}https://stackoverflow.com/questions/57774440
复制相似问题