我正在制作一个应用程序,当用户退出时,该应用程序将从阵列保存文件。我在退出事件处理程序通常位于app.xaml.cs页面的底部放置了以下代码,但是,此代码无法正确保存我的文件。
private async void OnSuspending(object sender, SuspendingEventArgs e)
{
await Closer();
var deferral = e.SuspendingOperation.GetDeferral();
//TODO: Save application state and stop any background activity
deferral.Complete();
}
private async Task Closer()
{
Windows.Storage.StorageFolder storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
Windows.Storage.StorageFile saver = await storageFolder.CreateFileAsync("scores.txt", Windows.Storage.CreationCollisionOption.ReplaceExisting);
var listOfStrings = new List<string> { Globals.scoreKeeper[0], Globals.scoreKeeper[1], Globals.scoreKeeper[2], Globals.scoreKeeper[3], Globals.scoreKeeper[4], Globals.scoreKeeper[5], Globals.scoreKeeper[6], Globals.scoreKeeper[7], Globals.scoreKeeper[8], Globals.scoreKeeper[9], Globals.scoreKeeper[10], Globals.scoreKeeper[11], Globals.scoreKeeper[12], Globals.scoreKeeper[13], Globals.scoreKeeper[14], Globals.scoreKeeper[15], Globals.scoreKeeper[16], Globals.scoreKeeper[17], Globals.scoreKeeper[18], Globals.scoreKeeper[19], Globals.scoreKeeper[20], Globals.scoreKeeper[21], Globals.scoreKeeper[22], Globals.scoreKeeper[23], Globals.scoreKeeper[24], Globals.scoreKeeper[25], Globals.scoreKeeper[26], Globals.scoreKeeper[27] };
await Windows.Storage.FileIO.AppendLinesAsync(saver, listOfStrings);
}
该保存系统确实可以在应用程序的其他部分上运行,但是每次我在此处运行该文件时,它都会擦除整个文件。我已经彻底搜索了stackoverflow和其他编程帮助网站,但没有找到解决此问题的方法。如果可能的话,我们将及时答复。
谢谢。
答案 0 :(得分:1)
您需要先推迟,然后再等待Closer。一旦OnSuspending在第一次等待时返回,应用程序便会继续暂停,并且由于延迟未激活,因此它不会等待:
var deferral = e.SuspendingOperation.GetDeferral();
//TODO: Save application state and stop any background activity
await Closer();
deferral.Complete();
请参见Handle app suspend文档中的备注,内容为:
如果您在处理程序中进行异步调用,则控件返回 立即从该异步调用。
这意味着执行可以 然后从事件处理程序返回,您的应用将移至下一个 状态,即使异步调用尚未完成。
在您的情况下,await Closer();
会在要求延期之前立即返回,并且该应用程序继续挂起,而无需等待Closer完成。由于它正在擦除文件,因此我们知道Closer可以运行到足以替换它的程度,但还不足以写出新数据。不过,“更接近”的范围不确定,但不确定,有时可能无法达到那么远,有时甚至可以变得更远。
为确保它是确定性的并等待它,它需要在Deferral块期间运行,如果保存时间可能超过几秒钟,则可能还需要ExtendedExecutionSession:
使用 EnteredBackgroundEventArgs对象上的GetDeferral方法是 传递给事件处理程序以将暂停时间推迟到您致电之后 返回的Windows.Foundation.Deferral上的Complete方法 宾语。
延期并不会增加您运行自己的金额 您的应用终止之前输入的代码。它只会延迟终止,直到 调用延迟的Complete方法或截止日期 通过-以先到者为准。延长处于挂起状态的时间 使用ExtendedExecutionSession