5

Windows8ベータ版でVS2012RCを使用していた私のWinRTアプリケーションでは、VisualStudioとWindows8 Proの最終バージョンで問題が発生し、OnSuspending内でファイルを作成/開くと、デバッガーブレークポイントをに設定した場合にのみ機能します。ファイルの作成方法。

private void OnSuspending(object sender, SuspendingEventArgs e){                        
     var deferral = e.SuspendingOperation.GetDeferral();                       
     if (null != m_document) Save();
     deferral.Complete();
}

async void Save(){
    var folder = KnownFolders.DocumentsLibrary;       
    var file = await folder.CreateFileAsync(GetFileName(),Windows.Storage.CreationCollisionOption.ReplaceExisting);                

    var xDoc = GetXDocument();
    using (var stream = await file.OpenStreamForWriteAsync()){
       xDoc.Save(stream);                    
    }           
}
  • にブレークポイントを設定するStorageFile file = await folder.CreateFileAsync(...と、デバッガーがになり、続行すると、すべて正常に動作します。

  • ただし、ブレークポイントを設定しないと、ファイルは作成されますが、xmlの内容は保存されません(ファイルは空のままになります)。

  • 行の下にブレークポイントを設定するとStorageFile file = await folder.CreateFileAsync(...、デバッガーは入力されません。

誰かアイデアはありますか?を使用するバージョンもテストしましたfolder.OpenStreamForWriteAsyncが、まったく同じ効果があります。

4

2 に答える 2

7

問題は、Save メソッドの呼び出しでした。最初の部分 (ファイルの作成) のみが待機され、2 番目の部分 (XML の保存) は非同期で実行されたため、中断操作の延期は保存プロセスの終了まで行われませんでした。

この問題を回避するために考えられる解決策は、保存操作の完了を明示的に待機することです。これは、OnSuspending メソッドを as として宣言しaysnc、await キーワードを使用して保存操作の完了を待機することで実現できます (Save メソッドの Task 戻り値の型に注意してください)。

private async void OnSuspending(object sender, SuspendingEventArgs e){                        
     var deferral = e.SuspendingOperation.GetDeferral();                       
     if (null != m_document) await Save();
     deferral.Complete();
}

async Task Save(){
    var folder = KnownFolders.DocumentsLibrary;       
    var file = await folder.CreateFileAsync(GetFileName(),Windows.Storage.CreationCollisionOption.ReplaceExisting);                

    var xDoc = GetXDocument();
    using (var stream = await file.OpenStreamForWriteAsync()){
       xDoc.Save(stream);                    
    }           
}

この投稿が、同じ落とし穴に陥った他の誰かの助けになることを願っています (なぜ w8 のベータ版で問題が発生しなかったのか疑問に思っていますが、MS がアプリケーションの終了プロセスを最適化したため、時間が短縮されたと思います)停止処理後の予期せぬ作業のため)...

于 2012-08-17T09:18:27.403 に答える
3

もう時間がありません。最初は約5秒ですが、使用することを宣言しないと、時間が短くなります。これを試して:

private async void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();
    try
    {
        await Task.Delay(1000);
        Debug.WriteLine("Done");
    }
    finally
    {
        deferral.Complete();
    }
}

詳しくはこちらをご覧ください。公式ドキュメントについては、こちらを参照してください。

注 アプリが中断されているときに非同期作業を行う必要がある場合は、作業が完了するまで中断の完了を延期する必要があります。SuspendingOperation オブジェクトの GetDeferral メソッド (イベント引数を介して利用可能) を使用して、返された SuspendingDeferral オブジェクトの Complete メソッドを呼び出すまで、サスペンドの完了を遅らせることができます。

于 2012-08-17T03:24:36.980 に答える