2

XMLファイルからデータを読み取ってオブジェクトに格納し、オブジェクト値をUI要素にバインドしているWindows 8アプリケーションでC#でメソッドを作成しています。

いくつかの非同期ファイル読み取りおよび書き込みメソッドを使用しています。メイン ページ コンストラクター内でこのメソッドを呼び出しているため、await キーワードを使用できないため、以下の例外が発生しています。"メソッドが予期しない時間に呼び出されました。(Exception from HRESULT: 0x8000000E)"

デバッグせずにアプリケーションを実行すると、(F11 を使用して) コードにステップインしてデバッグすると、目的の出力が得られます。デバッグせずに目的の出力を取得する方法

以下にコードスニペットを貼り付けました

public object mymethod()
{
    var FileshareDetails = Windows.Data.Xml.Dom.XmlDocument.LoadFromFileAsync(file, localsettings);
    var QFileshare = FileshareDetails.GetResults();
    XmlNodeList nodeList = QFileshare.SelectNodes("/FileShareDetails/FileShare");

    foreach (IXmlNode node in nodeList)
    {
        QSFileShare FileShare = new QSFileShare();
        FileShare.FileShareName = node.Attributes[0].InnerText;
        ...
    }
}
4

2 に答える 2

4

GetResultsノンブロッキングです。つまり、メソッドの実行が完了しておらず、結果がまだ取得されていない場合でも、非同期で実行されているメソッドからすぐに結果を取得しようとします。

awaitAsync を終了するメソッドでキーワードを使用する必要があります。これは、メソッドmymethodが非同期パターンに準拠する必要があることを意味します。asyncWindows 8 アプリを作成している場合は、すべてを一読する価値があります。

Async は、UI スレッドをブロックせずに応答性の高いアプリを作成しやすくするために設計されたコンパイラのトリックです。

または、スレッドをブロックしたい場合は、 でGetResults()呼び出しを切り替えることができますAsTask().Result

ブロックする正当な理由はあまりありませんが、おそらく単体テストまたはダーティな研究/デモ コードを除きます。ブロックする必要がある場合は、おそらくアーキテクチャ レベルで何か間違ったことをしている可能性があります。

于 2013-06-10T19:57:59.453 に答える
0

コードを onNavigatedTo イベント内に配置できます

于 2012-10-31T11:44:52.753 に答える