5

Windows 8アプリケーションにいくつかのデータがありますが、これは同梱する必要があり、静的データです。実際:これは単純なxmlファイルであり、逆シリアル化する必要があります。

データはAssets\data.xmlに保存されます(AssetsはBlank App Templateのデフォルトフォルダーです)。

私はそれにアクセスするためにこのコードを使用しています:

private static async Task<MyObject> Load()
{
    if (Windows.ApplicationModel.DesignMode.DesignModeEnabled)
    {
        return new SampleData();
    }

    var uri = new Uri("ms-appx:///Assets/data.xml");
    Debug.WriteLine("Getting file from Application");
    var file = await StorageFile.GetFileFromApplicationUriAsync(uri);
    Debug.WriteLine("Opening file for reading async");
    var stream = await file.OpenStreamForReadAsync();

    var serializer = new XmlSerializer(typeof(MyObject));

    Debug.WriteLine("Begin deserialization");
    var result = (MyObject)serializer.Deserialize(stream.AsInputStream().AsStreamForRead());

    return result;
}

メソッドの呼び出し:

public static MyObject GetMyObject()
{
    if (_myObject == null)
    {
        _myObject = Load().Result;
    }

    return _myObject;
}

それについての「面白い」部分は次のとおりです。

にブレークポイントを設定し、var uri = new Uri(...);F11を使用してコードをステップ実行すると、すべてが期待どおりに機能します。すべてのデバッグ行を取得し、アプリケーションは必要に応じて静的データを表示します。

ブレークポイントを設定せず、このコードをステップオーバーしない場合、のデバッグ出力のみが取得され、Getting a file from Applicationそれ以上何も起こりません。GetFileFromApplicationUriAsync()二度と戻ってこないようです。5分以上待ちましたが、何も起こりませんでした。

誰かアイデアがありますか?

4

1 に答える 1

12

コードを投稿していただきありがとうございます。Load次のように方法を変更してみてください。

//your code
var file = await StorageFile.GetFileFromApplicationUriAsync(uri).AsTask().ConfigureAwait(false);
//your code
var stream = await file.OpenStreamForReadAsync().ConfigureAwait(false);
//your code

ここでの主な違いはAsTask()。ConfigureAwait(false)です

編集:

それが機能していると聞いてうれしいです。説明は非常に簡単です。キーワードと組み合わせてtask.ResultまたはGUIスレッドで使用すると、デッドロックが発生します。これは、コードが呼び出されたのと同じコンテキスト(この場合はGUIスレッド)でコードが再開されたために発生します。また、タスクが(またはを介して)完了するのを現在待機しているGUIスレッドが発生し、キーワードの後のコードが呼び出されることはありません。現在のコンテキストを無視できることを指定し、コードを正常に完了できるようにします。詳細については、こちらをご覧ください:http: //blog.stephencleary.com/2012/07/dont-block-on-async-code.htmltask.Wait()awaitawaitingResultWait()awaitConfigureAwait(false)

于 2012-09-04T05:52:58.720 に答える