Fix: add dispose guard and early exit handler to App.axaml.cs

Co-authored-by: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2026-03-02 16:16:17 +00:00
parent 87f4a58fd3
commit 4abd80f9c1

View file

@ -26,6 +26,8 @@ public class App : Application, IDisposable
private readonly SettingsService _settingsService; private readonly SettingsService _settingsService;
private readonly MainViewModel _mainViewModel; private readonly MainViewModel _mainViewModel;
private bool _isDisposed;
public App() public App()
{ {
var services = new ServiceCollection(); var services = new ServiceCollection();
@ -98,8 +100,24 @@ public class App : Application, IDisposable
public override void OnFrameworkInitializationCompleted() public override void OnFrameworkInitializationCompleted()
{ {
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
desktop.MainWindow = new MainView { DataContext = _mainViewModel }; desktop.MainWindow = new MainView { DataContext = _mainViewModel };
void OnExit(object? sender, ControlledApplicationLifetimeExitEventArgs args)
{
if (sender is IControlledApplicationLifetime lifetime)
lifetime.Exit -= OnExit;
Dispose();
}
// Although `App.Dispose()` is invoked from `Program.Main(...)`, on some platforms
// it may be called too late in the shutdown lifecycle. Attach an exit
// handler to ensure timely disposal as a safeguard.
// https://github.com/Tyrrrz/YoutubeDownloader/issues/795
desktop.Exit += OnExit;
}
base.OnFrameworkInitializationCompleted(); base.OnFrameworkInitializationCompleted();
// Set up custom theme colors // Set up custom theme colors
@ -115,6 +133,11 @@ public class App : Application, IDisposable
public void Dispose() public void Dispose()
{ {
if (_isDisposed)
return;
_isDisposed = true;
_eventRoot.Dispose(); _eventRoot.Dispose();
_services.Dispose(); _services.Dispose();
} }