我的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/