2016-11-26 42 views
2

我有一個UWP項目需要來自XML文件的數據。我正在Blend中開發這個項目。在代碼中使用XDocument時出錯

當我添加一行:

XDocument xdoc = XDocument.Load("E:/VisualStudioRepo/ImportFromXML/ImportFromXML/Assets/XML/Book2.xml"); 

我得到一個錯誤:

An exception of type 'System.InvalidOperationException' occurred in System.IO.FileSystem.dll but was not handled in user code

Additional information: Synchronous operations should not be performed on the UI thread. Consider wrapping this method in 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

我有點困惑..文件路徑是否在控制檯應用程序中用'/'s工作? – Slai

+0

是的,與/ s完美配合。 – RichPro

回答

0

雖然我不太清楚爲什麼你會收到這個錯誤,但我一定會幫你使用Task.Run()

Task.Run allows you to run tasks on a background thread, so that you don't block the UI thread.

您可以使用它像這樣:

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

+0

謝謝你,傑里米。我已經按照建議嘗試了兩種方法,並且原始錯誤已消失,只能替換爲: – RichPro

+0

「mscorlib.ni.dll中發生類型爲'System.UnauthorizedAccessException'的異常,但未在用戶代碼中處理 其他信息:訪問路徑'E:\ Book.xml'被拒絕。「 我試圖將文件移動到不同的位置,但無濟於事。這與線程有關嗎? – RichPro

+0

@RichPro在UWP中閱讀權限,因爲它與在純桌面應用程序(WPF)中說的不同。更新:乍一看,您似乎只能訪問應用默認數據存儲並執行彙編文件夾內容。 – Karolis

0

這是我沒有根據的建議從@Jeremy:

var newTask = Task.Run(() => GetSentence()) ; 

注意,有在GetSentence之前沒有括號。

這是我基於從@Karolis諮詢和研究產生什麼:

動了我的XML文檔的documentsLibrary。

在我的appxmanifest文件中爲能力添加了'documentsLibrary'(注意,此步驟必須在代碼中完成,因爲它未在UI中公開)。

<Capabilities> 
    <uap:Capability Name="documentsLibrary" /> 
</Capabilities> 

在我的appxmanifest文件中添加了'.xml'到Extensions(可以在Declarations選項卡的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> 
相關問題