我的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
的版本,效果非常相似。
答案 0 :(得分:7)
问题是调用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已经优化了应用程序终止过程,因此暂停过程后意外工作的时间减少了......)
答案 1 :(得分: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();
}
}
有关详细信息,请参阅here。有关官方文档,请参阅here:
注意如果您的应用程序存在时需要进行异步工作 暂停你将需要推迟完成暂停直到之后 你的工作完成了。你可以在上面使用GetDeferral方法 SuspendingOperation对象(通过事件args可用)延迟 完成暂停直到你调用Complete方法之后 返回SuspendingDeferral对象。