对于 C/XAML 中的 Windows 8 应用程序,我必须将一些数据存储到 LocalState 文件夹。我认为我在使用 async/await 运算符时遇到了一些麻烦。
当我在应用程序运行时保存数据时,一切正常,但是当我尝试在 OnSuspending 方法期间保存数据时,我的应用程序似乎没有等待我的保存方法完成以暂停应用程序。
奇怪的是,当我在调试并逐步进行所有操作时,一切正常,但是当我不放置任何断点时,应用程序在保存数据之前就关闭了。
这是我的代码:
private async void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
await api.BeforeClosing(true);
deferral.Complete();
}
public async Task BeforeClosing(Boolean toTombstoning)
{
SaveItem<LoadingProgress>(fileNameLoadingProgress, InitLoading);
}
public static async void SaveItem<T>(String fileName, T data, Boolean crossThreadSecure = false) where T : IBinarySerializable
{
await CreateNewStorageFile(fileName);
StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
StorageFolder dataFolder = await localFolder.GetFolderAsync("Data");
StorageFile file = await dataFolder.GetFileAsync(fileName);
using (var stream = await file.OpenStreamForWriteAsync())
{
using (var writer = new BinaryWriter(stream))
{
writer.Write<T>(data);
}
}
}
public async static Task CreateNewStorageFile(string filename)
{
StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
StorageFolder dataFolder = await localFolder.CreateFolderAsync("Data", CreationCollisionOption.OpenIfExists);
storage = await dataFolder.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);
}
我对 await 运算符做错了吗?或者在暂停应用程序之前我们可以做一些操作的最大时间量是多少?
谢谢
编辑:我做了一些新的测试:如果我删除 deferral.Complete(); 从 OnSuspending 方法来看,它可以很好地保存数据(但永远不要关闭应用程序......)。我真的认为问题在于应用程序暂停时我的时间用完了。看起来确实像这个线程上的问题:StorageFolder.CreateFileAsync 在从 App.OnSuspending 调用时崩溃。但是我已经尝试了这个问题的所有解决方案,但我仍然有问题......