From 2b4827102d1203f7be279308f1198229c7755779 Mon Sep 17 00:00:00 2001 From: Mayuki Sawatari Date: Mon, 11 Mar 2024 10:21:18 +0900 Subject: [PATCH] Register TimeProvider as Singleton. --- .../ObservableSystemInitializationService.cs | 10 ++++++---- src/R3/SynchronizationContextTimeProvider.cs | 17 ++++++++++++++--- 2 files changed, 20 insertions(+), 7 deletions(-) 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); } }