2016-11-26 14 views
2

XMLファイルのデータを必要とするUWPプロジェクトがあります。私は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 Consoleアプリケーションで完全なLinqコードをテストしましたが、 xmlは完全に存在し、xmlファイルの全部または一部のリストを出力します。だから、XMLファイルはOKで、私の基本的な方法論はうまくいくようです。 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純粋なデスクトップアプリケーション(WPF)とは違って、UWPでの許可をお読みください。アップデート:一見すると、アプリケーションのデフォルトのデータストレージにアクセスし、アセンブリフォルダのコンテンツを実行することしかできないようです。 – Karolis

0

は私が@Jeremyからの助言に基づいたものです:

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

注意がいることGetSentenceの前にかっこはありません。

これは私が@Karolisからのアドバイス、そして得られた研究に基づいたものです:

documentsLibraryに私のXMLドキュメント移動しました。

appxmanifestファイルのcapabilitiesに 'documentsLibrary'を追加しました(この手順はUIで公開されていないため、コード内で行う必要があります)。

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

私appxmanifestファイル内の拡張機能に追加「.xmlファイルは」(宣言タブ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> 
関連する問題