加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows-8 – 从App.OnSuspending调用时,StorageFolder.CreateFi

发布时间:2020-12-14 02:54:09 所属栏目:Windows 来源:网络整理
导读:我的Win RT应用程序在 Windows 8测试版上与VS2012RC一起使用,现在已经有了最终版本的visual studio和windows 8 pro的问题,在OnSuspending中创建/打开文件只有在我将调试器断点设置为文件创建方法. private void OnSuspending(object sender,SuspendingEventA
我的Win RT应用程序在 Windows 8测试版上与VS2012RC一起使用,现在已经有了最终版本的visual studio和windows 8 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的版本,效果非常相似.

解决方法

问题是调用Save-method.仅等待第一部分(创建文件),第二部分(保存XML)完成异步,因此挂起操作的延迟直到保存过程结束.

避免此问题的可能解决方案是明确等待以完成保存操作.这可以通过将OnSuspending方法声明为aysnc然后等待使用await关键字完成save操作来完成(请注意Save-method的Task return-type).

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已经优化了应用程序终止过程,因此时间更短暂停过程后的意外工作)…

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读