我的Win RT应用程序已在Windows 8 beta上与VS2012RC一起使用,现在具有Visual Studio和Windows 8 Pro的最终版本,该问题是,只有在将调试器断点设置为OnSuspending的情况下,才能在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 = awaitfolder.CreateFileAsync(...上设置了一个断点,则调试器将输入和
    继续,一切正常。
  • 但是,如果我不设置断点,则将创建文件,但是
    xml的内容将不会保存(文件为空)。
  • 如果我在StorageFile file = await folder.CreateFileAsync(...行的下方设置了一个断点,则调试器将永远不会进入!

  • 有人知道吗?我还测试了使用folder.OpenStreamForWriteAsync的版本,效果相同。

    最佳答案

    问题是调用保存方法。仅等待第一部分(创建文件),第二部分(保存XML)是异步完成的,因此直到保存过程结束才暂停挂起操作。

    避免此问题的可能解决方案是明确地等待保存操作的完成。这可以通过将OnSuspending方法声明为aysnc,然后使用await关键字等待save操作完成(请注意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 Beta并没有出现问题,但是我认为MS已经优化了应用程序终止过程,因此时间更少了暂停过程后的意外工作)...

    关于windows-8 - 从App.OnSuspending调用时StorageFolder.CreateFileAsync崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11996288/

    10-13 05:56