用户退出时将文件保存在本地应用文件夹中

时间:2019-01-05 17:03:48

标签: c# uwp

我正在制作一个应用程序,当用户退出时,该应用程序将从阵列保存文件。我在退出事件处理程序通常位于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和其他编程帮助网站,但没有找到解决此问题的方法。如果可能的话,我们将及时答复。

谢谢。

1 个答案:

答案 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