对于 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);
}
我对等待运算符做错了什么吗?或者在暂停应用程序之前我们可以执行某些操作是否有最长时间?
谢谢
编辑:我做了一些新的测试:如果我删除 deferral.Complete();从 OnSuspending 方法来看,它很好地保存了数据(但显然永远不会关闭应用程序......)。我真的认为问题是当应用程序挂起时我用完了时间。它确实看起来像这个线程上的问题:从 App.OnSuspending 调用时 StorageFolder.CreateFileAsync 崩溃 https://stackoverflow.com/questions/11996288/storagefolder-createfileasync-crashes-when-called-from-app-onsuspending。但是我已经尝试了这个问题的所有解决方案,但我仍然有问题......
你的问题是你正在打电话Complete
在你所有的之前async
操作已完成。
最简单的解决方案是SaveItem
an async Task
方法而不是async void
, 进而await
it in BeforeClosing
.
作为基本规则,async
方法应该总是返回Task
/Task<T>
除非他们have回来void
(例如,事件处理程序)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)