在后面的代码中使用XDocument时出错

时间:2016-11-26 03:17:44

标签: c# linq uwp

我有一个需要来自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中包装此方法"?如果是这样,请告诉我该怎么做。让我感到惊讶的是,尽管经过数小时的搜索,我仍然无法在网上看到其他任何有这个问题的人,所以我怀疑我做错了什么。

我是一位喜欢编程的自认可爱的业余程序员(以及一位老朋友也是如此),所以请帮我解释清楚,请不要告诉我回去这是很久以前的学校!

2 个答案:

答案 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>