我有一个需要来自XML文件的数据的UWP项目。我正在Blend开发项目。
当我添加这一行时:
XDocument xdoc = XDocument.Load("E:/VisualStudioRepo/ImportFromXML/ImportFromXML/Assets/XML/Book2.xml");
我收到错误:
类型' System.InvalidOperationException'的例外情况发生在System.IO.FileSystem.dll中但未在用户代码中处理
附加信息:不应在UI线程上执行同步操作。考虑在Task.Run中包装此方法。
我可以通过启动一个新项目,添加一个xaml按钮和后面的代码来复制这个错误:
public void GetSentence()
{
XDocument xdoc = XDocument.Load("E:/VisualStudioRepo/ImportFromXML/ImportFromXML/Assets/XML/Book2.xml");
}
private void button_Click(object sender, RoutedEventArgs e)
{
GetSentence();
}
我在Visual Studio控制台应用程序中测试了我的完整Linq代码,我可以在那里完美地读取xml并输出全部或部分xml文件的列表。所以xml文件没问题,我的基本方法似乎有效。它只是在UWP环境中工作。
我是否真的必须在#Task; Run中包装此方法"?如果是这样,请告诉我该怎么做。让我感到惊讶的是,尽管经过数小时的搜索,我仍然无法在网上看到其他任何有这个问题的人,所以我怀疑我做错了什么。
我是一位喜欢编程的自认可爱的业余程序员(以及一位老朋友也是如此),所以请帮我解释清楚,请不要告诉我回去这是很久以前的学校!
答案 0 :(得分:0)
虽然我不太清楚为什么会收到此错误,但我一定会帮助您使用Task.Run()
。
Task.Run允许您在后台线程上运行任务,这样就不会阻止UI线程。
您可以像这样使用它:
private void button_Click(object sender, RoutedEventArgs e)
{
var newTask = Task.Run(() => (GetSentence());
}
这样做是在不同的线程上调用GetSentence()方法,同时仍然给你相同的结果。
您也可以这样做以获得相同的效果!
var newTask = Task.Run(() => { XDocument xdoc = XDocument.Load("E:/VisualStudioRepo/ImportFromXML/ImportFromXML/Assets/XML/Book2.xml"); });
最后,开发者网络在这里有一篇很棒的文章,其中有类似的例子:You can find more info here
答案 1 :(得分:0)
以下是根据@Jeremy的建议做的事情:
var newTask = Task.Run(() => GetSentence()) ;
请注意,GetSentence之前没有括号。
这是我根据@Karolis的建议和最终的研究所做的:
将我的XML文档移至documentsLibrary。
添加' documentsLibrary'到我的appxmanifest文件中的功能(请注意,此步骤必须在代码中完成,因为它未在UI中公开)。
<Capabilities>
<uap:Capability Name="documentsLibrary" />
</Capabilities>
添加&#39; .xml&#39;到我的appxmanifest文件中的扩展(可以在声明选项卡的UI中完成)。
<Extensions>
<uap:Extension Category="windows.fileTypeAssociation">
<uap:FileTypeAssociation Name=".xml">
<uap:SupportedFileTypes>
<uap:FileType>.xml</uap:FileType>
</uap:SupportedFileTypes>
</uap:FileTypeAssociation>
</uap:Extension>
</Extensions>