diff --git a/src/R3.Blazor/ObservableSystemInitializationService.cs b/src/R3.Blazor/ObservableSystemInitializationService.cs index 77fd1014..67c834b5 100644 --- a/src/R3.Blazor/ObservableSystemInitializationService.cs +++ b/src/R3.Blazor/ObservableSystemInitializationService.cs @@ -1,15 +1,17 @@ -namespace R3; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace R3; public static class BlazorR3Extensions { public static IServiceCollection AddBlazorR3(this IServiceCollection services) { - return AddBlazorR3(services, _ => new SynchronizationContextTimeProvider(), null!); + return AddBlazorR3(services, _ => new SynchronizationContextTimeProvider(() => SynchronizationContext.Current), null!); } public static IServiceCollection AddBlazorR3(this IServiceCollection services, Action unhandledExceptionHandler) { - return AddBlazorR3(services, _ => new SynchronizationContextTimeProvider(), unhandledExceptionHandler); + return AddBlazorR3(services, _ => new SynchronizationContextTimeProvider(() => SynchronizationContext.Current), unhandledExceptionHandler); } public static IServiceCollection AddBlazorR3(this IServiceCollection services, Func timeProviderFactory) @@ -20,7 +22,7 @@ public static IServiceCollection AddBlazorR3(this IServiceCollection services, F public static IServiceCollection AddBlazorR3(this IServiceCollection services, Func timeProviderFactory, Action unhandledExceptionHandler) { services.AddHttpContextAccessor(); - services.AddScoped(timeProviderFactory); + services.TryAddSingleton(timeProviderFactory); services.AddHostedService(sp => new ObservableSystemInitializationService(sp.GetRequiredService(), unhandledExceptionHandler)); return services; diff --git a/src/R3/SynchronizationContextTimeProvider.cs b/src/R3/SynchronizationContextTimeProvider.cs index 373dae49..762589db 100644 --- a/src/R3/SynchronizationContextTimeProvider.cs +++ b/src/R3/SynchronizationContextTimeProvider.cs @@ -2,7 +2,7 @@ public sealed class SynchronizationContextTimeProvider : TimeProvider { - readonly SynchronizationContext? synchronizationContext; + readonly Func synchronizationContextAccessor; readonly TimeProvider timeProvider; public SynchronizationContextTimeProvider() @@ -15,15 +15,26 @@ public SynchronizationContextTimeProvider(SynchronizationContext? synchronizatio { } + public SynchronizationContextTimeProvider(Func synchronizationContextAccessor) + : this(synchronizationContextAccessor, TimeProvider.System) + { + } + public SynchronizationContextTimeProvider(SynchronizationContext? synchronizationContext, TimeProvider timeProvider) { - this.synchronizationContext = synchronizationContext; + this.synchronizationContextAccessor = () => synchronizationContext; + this.timeProvider = timeProvider; + } + + public SynchronizationContextTimeProvider(Func synchronizationContextAccessor, TimeProvider timeProvider) + { + this.synchronizationContextAccessor = synchronizationContextAccessor; this.timeProvider = timeProvider; } public override ITimer CreateTimer(TimerCallback callback, object? state, TimeSpan dueTime, TimeSpan period) { - return new SynchronizationContextTimer(timeProvider, synchronizationContext, callback, state, dueTime, period); + return new SynchronizationContextTimer(timeProvider, synchronizationContextAccessor(), callback, state, dueTime, period); } }