From 655ca5d415b299b311cba8f398caad7af9f82a01 Mon Sep 17 00:00:00 2001 From: Simnico99 Date: Wed, 11 Jan 2023 08:39:26 -0500 Subject: [PATCH] Testing changes --- .../Hosting/AddBackgroundServiceExtension.cs | 22 +---------- .../Lifetime/UseWpfApplicationLifetime.cs | 39 ++++++++----------- 2 files changed, 19 insertions(+), 42 deletions(-) diff --git a/src/ZirconNet.Core/Hosting/AddBackgroundServiceExtension.cs b/src/ZirconNet.Core/Hosting/AddBackgroundServiceExtension.cs index 4601994..2832d9e 100644 --- a/src/ZirconNet.Core/Hosting/AddBackgroundServiceExtension.cs +++ b/src/ZirconNet.Core/Hosting/AddBackgroundServiceExtension.cs @@ -15,16 +15,7 @@ public static IServiceCollection AddBackgroundServices(this ISe where TImplementation : BackgroundService { _ = services.AddSingleton(); - _ = services.AddSingleton(serviceProvider => - { - var service = serviceProvider.GetRequiredService(); - var hostApplicationLifetime = serviceProvider.GetRequiredService(); - - hostApplicationLifetime.ApplicationStarted.Register(() => service.StartAsync(hostApplicationLifetime.ApplicationStopping)); - hostApplicationLifetime.ApplicationStopping.Register(async () => await service.StopAsync(hostApplicationLifetime.ApplicationStopped)); - - return service; - }); + _ = services.AddSingleton(x => x.GetRequiredService()); _ = services.AddHostedService(x => x.GetRequiredService()); return services; @@ -42,16 +33,7 @@ public static IServiceCollection AddBackgroundServices(); _ = services.AddSingleton(x => x.GetRequiredService()); - _ = services.AddSingleton(serviceProvider => - { - var service = serviceProvider.GetRequiredService(); - var hostApplicationLifetime = serviceProvider.GetRequiredService(); - - hostApplicationLifetime.ApplicationStarted.Register(() => service.StartAsync(hostApplicationLifetime.ApplicationStopping)); - hostApplicationLifetime.ApplicationStopping.Register(async () => await service.StopAsync(hostApplicationLifetime.ApplicationStopped)); - - return service; - }); + _ = services.AddSingleton(x => x.GetRequiredService()); _ = services.AddHostedService(x => x.GetRequiredService()); return services; diff --git a/src/ZirconNet.WPF/Hosting/Lifetime/UseWpfApplicationLifetime.cs b/src/ZirconNet.WPF/Hosting/Lifetime/UseWpfApplicationLifetime.cs index 8c438d3..8771144 100644 --- a/src/ZirconNet.WPF/Hosting/Lifetime/UseWpfApplicationLifetime.cs +++ b/src/ZirconNet.WPF/Hosting/Lifetime/UseWpfApplicationLifetime.cs @@ -46,20 +46,10 @@ public static IHostBuilder UseWpfApplicationLifetime(this IHostBuilder builder, /// The mainwindows to show and wait to close. /// A that can be used to cancel the console. /// A that only completes when the token is triggered or shutdown is triggered. - public static Task RunWpfApplicationAsync(this IHostBuilder builder, CancellationToken cancellationToken = default) where T : Window + public static Task RunWpfApplicationAsync(this IHostBuilder builder, CancellationToken cancellationToken = default) where T : Window { - builder.ConfigureServices(services => services.AddSingleton()); - - return Task.Run(async () => - { - using var host = builder.UseWpfApplicationLifetime().Build(); - var window = host.Services.GetRequiredService(); - - await host.StartAsync(cancellationToken); - await Application.Current.Dispatcher.Invoke(async () => await window.ShowDialogAsync()); - await host.StopAsync(); - host?.Dispose(); - }); + builder.UseWpfApplicationLifetime(); + return RunWpfApplicationAsyncInternal(builder, cancellationToken); } /// @@ -71,18 +61,23 @@ public static Task RunWpfApplicationAsync(this IHostBuilder builder, Cancella /// A that can be used to cancel the console. /// A that only completes when the token is triggered or shutdown is triggered. public static Task RunWpfApplicationAsync(this IHostBuilder builder, Action configureOptions, CancellationToken cancellationToken = default) where T : Window + { + builder.UseWpfApplicationLifetime(configureOptions); + return RunWpfApplicationAsyncInternal(builder, cancellationToken); + } + + private static Task RunWpfApplicationAsyncInternal(IHostBuilder builder, CancellationToken cancellationToken) where T : Window { builder.ConfigureServices(services => services.AddSingleton()); - return Task.Run(async () => - { - using var host = builder.UseWpfApplicationLifetime(configureOptions).Build(); - var window = host.Services.GetRequiredService(); + using var host = builder.Build(); + var window = host.Services.GetRequiredService(); - await host.StartAsync(cancellationToken); - await Application.Current.Dispatcher.Invoke(async () => await window.ShowDialogAsync()); - await host.StopAsync(); - host?.Dispose(); - }); + var startTask = host.StartAsync(cancellationToken); + var dialogTask = window.ShowDialogAsync(); + var stopTask = host.StopAsync(); + host?.Dispose(); + + return Task.Factory.ContinueWhenAll(new Task[] { startTask, dialogTask, stopTask }, async (tasks) => { foreach (var task in tasks) { await task; } }); } }