UWP 应用程序闲置一段时间后恢复时崩溃

问题描述 投票:0回答:1

我多年来一直在开发 UWP 音乐播放器应用程序。我遇到了一个问题,即应用程序在闲置一段不确定的时间后恢复时会崩溃。但是,如果音乐播放器继续播放,该应用程序就可以正常运行。当应用程序在闲置后重新获得焦点时,就会发生崩溃。我无法稳定地重现崩溃,但大多数时候它确实会发生。我只是不知道需要多长时间。 我尝试通过附加调试器来诊断问题,但附加调试器时不会发生崩溃。在

class App : Application

中,我在

Resuming
Suspending
UnhandledException
方法中添加了try-catch和日志,但仍然无法查明崩溃的原因。
我不知道如何进一步解决这个问题。任何关于下一步要采取什么步骤或如何正确

诊断和避免此类崩溃

的建议将不胜感激。 这是我的音乐播放器的部分代码

public class MusicPlayer : IMusicEventListener { public static MediaPlaybackState PlaybackState => Player.PlaybackSession.PlaybackState; public static bool IsPlaying => PlaybackState == MediaPlaybackState.Playing; public static Playlist NowPlaying => new Playlist(MenuFlyoutHelper.NowPlaying, CurrentPlaylist); private static MediaPlaybackList PlaybackList = new MediaPlaybackList() { MaxPlayedItemsToKeepOpen = 1 }; public static MediaPlayer Player = new MediaPlayer() { Source = PlaybackList }; }

这是我的App类的部分代码

sealed partial class App : Application { public static bool Inited { get; private set; } = false; public static List<Action> LoadedListeners = new List<Action>(); public App() { this.InitializeComponent(); this.Suspending += OnSuspending; this.Resuming += App_Resuming; this.UnhandledException += App_UnhandledException; } private void App_Resuming(object sender, object e) { Debug.WriteLine($"sender {sender.GetType()} e {e}"); } protected override void OnLaunched(LaunchActivatedEventArgs e) { OnLaunched(e, null); } private void OnSuspending(object sender, SuspendingEventArgs e) { var deferral = e.SuspendingOperation.GetDeferral(); try { TileHelper.ResumeTile(); ToastHelper.HideToast(); Save(); SQLHelper.ClearInactive(); } catch (Exception ex) { Log.Warn($"OnSuspending exception {ex}"); } deferral.Complete(); } public static async void Save() { SettingsHelper.Save(); MusicPlayer.Save(); await Helper.ClearBackups(10); } protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args) { var deferral = args.TaskInstance.GetDeferral(); switch (args.TaskInstance.Task.Name) { case ToastHelper.ToastTaskName: if (args.TaskInstance.TriggerDetails is Windows.UI.Notifications.ToastNotificationActionTriggerDetail details) { // Perform tasks if (Enum.TryParse(typeof(ToastButtonEnum), details.Argument, out object toastButton)) { try { HandleBackgroundActivation((ToastButtonEnum)toastButton); } catch (Exception e) { Log.Warn($"HandleBackgroundActivation failed {e}"); } } } break; } deferral.Complete(); } private async void HandleBackgroundActivation(ToastButtonEnum toastButton) { switch (toastButton) { case ToastButtonEnum.Next: MusicPlayer.MoveNext(); if (MusicPlayer.PlayMode == PlayMode.RepeatOne) { ToastHelper.HideToast(); await ToastHelper.ShowToast(MusicPlayer.CurrentMusic, MusicPlayer.PlaybackState); } break; case ToastButtonEnum.Pause: MusicPlayer.Pause(); break; case ToastButtonEnum.Play: MusicPlayer.Play(); break; case ToastButtonEnum.SwitchLyricsSourceToMusic: await ToastHelper.SwitchLyricsSource(LyricsSource.Music); break; case ToastButtonEnum.SwitchLyricsSourceToLrcFile: await ToastHelper.SwitchLyricsSource(LyricsSource.LrcFile); break; case ToastButtonEnum.SwitchLyricsSourceToInternet: await ToastHelper.SwitchLyricsSource(LyricsSource.Internet); break; } } protected override async void OnFileActivated(FileActivatedEventArgs args) { base.OnFileActivated(args); Music music = await Music.LoadFromPathAsync(args.Files[0].Path); Log.Info("activate file " + args.Files[0].Path); if (music == null) { Helper.ShowButtonedNotification("CannotReadLocalMusicFile", "Authorize", async (n) => { await StorageHelper.AuthorizeFolder(); }); return; } if (args.PreviousExecutionState == ApplicationExecutionState.Running) { MusicPlayer.AddNextAndPlay(music); } else { OnLaunched(null, music); } } private void App_UnhandledException(object sender, Windows.UI.Xaml.UnhandledExceptionEventArgs e) { Log.Error("App_UnhandledException {0}", e.Exception); } }


uwp
1个回答
0
投票
Save()

函数中抛出异常,该函数是

async void
而不是
async Task
。因此,它的异常是异步抛出的,并且没有在 OnSuspending 中捕获。因此,解决方案只需在
Save()
函数中捕获问题即可。
private void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();
    try
    {
        TileHelper.ResumeTile();
        ToastHelper.HideToast();
        Save();
        SQLHelper.ClearInactive();
    }
    catch (Exception ex)
    {
        Log.Warn($"OnSuspending exception {ex}");
    }
    deferral.Complete();
}

public static async void Save()
{
    SettingsHelper.Save();
    MusicPlayer.Save();
    await Helper.ClearBackups(10);
}

© www.soinside.com 2019 - 2024. All rights reserved.