C# 在代码隐藏中使用XDocument时出错

C# 在代码隐藏中使用XDocument时出错,c#,linq,uwp,C#,Linq,Uwp,我有一个UWP项目,它需要来自XML文件的数据。我正在混合开发这个项目 当我添加行时: XDocument xdoc = XDocument.Load("E:/VisualStudioRepo/ImportFromXML/ImportFromXML/Assets/XML/Book2.xml"); 我得到一个错误: System.IO.FileSystem.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理 附加信

我有一个UWP项目,它需要来自XML文件的数据。我正在混合开发这个项目

当我添加行时:

XDocument xdoc = XDocument.Load("E:/VisualStudioRepo/ImportFromXML/ImportFromXML/Assets/XML/Book2.xml");
我得到一个错误:

System.IO.FileSystem.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理

附加信息:不应在UI线程上执行同步操作。考虑在任务.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();
}
我已经在VisualStudio控制台应用程序中测试了我的完整Linq代码,我可以在那里完美地读取xml并输出全部或部分xml文件的列表。所以xml文件还可以,我的基本方法似乎也可以。它在UWP环境中无法工作

我真的必须“将此方法包装在Task.Run中”吗?如果是这样,请告诉我怎么做。令我惊讶的是,尽管搜索了几个小时,我在网上还是看不到其他人有这个问题,所以我怀疑我做错了什么


我是一个自认热爱编程的业余程序员(也是一个“老家伙”),所以请帮我解释清楚,不要告诉我回到学校,因为那是很久以前的事了

虽然我不太确定您为什么会出现此错误,但我肯定会帮助您使用
Task.Run()

Run允许您在后台线程上运行任务,这样您就不会阻塞UI线程

您可以这样使用它:

private void button_Click(object sender, RoutedEventArgs e)
{
    var newTask = Task.Run(() => (GetSentence());
}
这样做的目的是在另一个线程上调用getSession()方法,同时仍然给出相同的结果

您也可以这样做,以获得相同的效果

var newTask = Task.Run(() => {  XDocument xdoc = XDocument.Load("E:/VisualStudioRepo/ImportFromXML/ImportFromXML/Assets/XML/Book2.xml"); });
最后,《开发者网络》有一篇很好的文章,其中有类似的例子:

以下是我根据@Jeremy的建议所做的:

请注意,Get句子前没有括号

这是我根据@Karolis的建议和研究结果所做的:

已将我的XML文档移动到文档库

将“documentsLibrary”添加到我的appxmanifest文件中的功能中(注意,此步骤必须在代码中完成,因为它没有在UI中公开)


将“.xml”添加到我的appxmanifest文件的扩展名中(可以在“声明”选项卡的UI中完成)


.xml

我有点困惑。。文件路径是否与控制台应用程序中的
/
s配合使用?是的,与/s配合使用非常好。谢谢Jeremy。我已经按照建议尝试了这两种方法,最初的错误已经消失,但被替换为:“mscorlib.ni.dll中发生了类型为'System.UnauthorizedAccessException'的异常,但未在用户代码中处理。其他信息:拒绝访问路径'E:\Book.xml'我尝试将文件移动到不同的位置,但没有成功。这与线程有关吗?@RichPro阅读了UWP中的许可,因为它与纯桌面应用(WPF)中的许可不同。更新:乍一看,您似乎只能访问应用程序的默认数据存储和执行程序集文件夹内容。@Karolis极好的建议。我现在好像已经修好了。我会在几天后发布我发现的。
var newTask = Task.Run(() => GetSentence()) ;
<Capabilities>
  <uap:Capability Name="documentsLibrary" />   
</Capabilities>
<Extensions>
   <uap:Extension Category="windows.fileTypeAssociation">
      <uap:FileTypeAssociation Name=".xml">
         <uap:SupportedFileTypes>
            <uap:FileType>.xml</uap:FileType>
         </uap:SupportedFileTypes>
      </uap:FileTypeAssociation>
   </uap:Extension>
</Extensions>