Вам нужно получить отсрочку, прежде чем ждать, а не после. Приложение продолжает приостанавливаться, как только 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