Сохранить файл в локальной папке приложения при выходе пользователя - PullRequest
0 голосов
/ 05 января 2019

Я делаю приложение, которое будет сохранять файл из массива при выходе пользователя. Я поместил следующий код внизу страницы 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 голосов
/ 05 января 2019

Вам нужно получить отсрочку, прежде чем ждать, а не после. Приложение продолжает приостанавливаться, как только OnSuspending возвращается в первое ожидание, и поскольку отсрочка не активна, она не ждет этого:

var deferral = e.SuspendingOperation.GetDeferral();
//TODO: Save application state and stop any background activity
await Closer();
deferral.Complete();

См. Примечания в приложении приостановить документацию, которая гласит:

Если вы делаете асинхронный вызов в своем обработчике, управление возвращает немедленно из этого асинхронного вызова.

Это означает, что выполнение может затем вернитесь из обработчика событий, и ваше приложение перейдет к следующему состояние, хотя асинхронный вызов еще не завершен.

В вашем случае await Closer(); возвращается немедленно, до того, как заявка на отсрочку заявлена, и приложение продолжает приостанавливаться, не дожидаясь завершения Closer. Поскольку он стирает файл, мы знаем, что Closer работает достаточно далеко, чтобы заменить его, но недостаточно, чтобы записать новые данные. То, как далеко заходит Клозер, не является детерминированным, и иногда он может не зайти так далеко, а иногда - дальше.

Чтобы убедиться, что он является детерминированным и его ожидают, он должен работать во время блока отсрочки, и, если для его сохранения может потребоваться больше нескольких секунд, вам также может понадобиться ExtendedExecutionSession:

Используйте Метод GetDeferral для объекта EnteredBackgroundEventArgs, который передается вашему обработчику событий, чтобы отложить приостановку до вызова Полный метод на возвращенном Windows.Foundation.Deferral объект.

Отсрочка не увеличивает сумму, которую вы должны запустить код, прежде чем ваше приложение будет прекращено. Это только задерживает завершение до либо вызывается метод Complete отсрочки, либо срок проходит в зависимости от того, что наступит раньше. Продлить время в состоянии приостановки использовать ExtendedExecutionSession

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...