【发布时间】: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