diff --git a/src/BootstrapBlazor.Server/Components/Components/CacheCounter.razor b/src/BootstrapBlazor.Server/Components/Components/CacheCounter.razor new file mode 100644 index 00000000000..e38a986f6d8 --- /dev/null +++ b/src/BootstrapBlazor.Server/Components/Components/CacheCounter.razor @@ -0,0 +1,4 @@ + diff --git a/src/BootstrapBlazor.Server/Components/Components/CacheCounter.razor.cs b/src/BootstrapBlazor.Server/Components/Components/CacheCounter.razor.cs new file mode 100644 index 00000000000..2fed16b78c8 --- /dev/null +++ b/src/BootstrapBlazor.Server/Components/Components/CacheCounter.razor.cs @@ -0,0 +1,44 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the Apache 2.0 License +// See the LICENSE file in the project root for more information. +// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone + +namespace BootstrapBlazor.Server.Components.Components; + +/// +/// 缓存数量组件 +/// +public partial class CacheCounter : IDisposable +{ + [Inject, NotNull] + private ICacheManager? CacheManager { get; set; } + + private readonly CancellationTokenSource _cancellationTokenSource = new(); + + /// + /// + /// + /// + protected override async Task OnAfterRenderAsync(bool firstRender) + { + await base.OnAfterRenderAsync(firstRender); + + try + { + await Task.Delay(5000, _cancellationTokenSource.Token); + StateHasChanged(); + } + catch { } + } + + /// + /// + /// + /// + public void Dispose() + { + _cancellationTokenSource.Cancel(); + _cancellationTokenSource.Dispose(); + GC.SuppressFinalize(this); + } +} diff --git a/src/BootstrapBlazor.Server/Components/Components/FooterCounter.razor b/src/BootstrapBlazor.Server/Components/Components/FooterCounter.razor index 3557985acf8..ba92ec87b31 100644 --- a/src/BootstrapBlazor.Server/Components/Components/FooterCounter.razor +++ b/src/BootstrapBlazor.Server/Components/Components/FooterCounter.razor @@ -5,7 +5,7 @@ @if (_options.Enable) { } diff --git a/src/BootstrapBlazor.Server/Components/Components/FooterCounter.razor.cs b/src/BootstrapBlazor.Server/Components/Components/FooterCounter.razor.cs index a19cc3b3f8e..370581d1832 100644 --- a/src/BootstrapBlazor.Server/Components/Components/FooterCounter.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Components/FooterCounter.razor.cs @@ -14,7 +14,7 @@ public partial class FooterCounter : IDisposable { private string? Runtime { get; set; } - private CancellationTokenSource DisposeTokenSource { get; } = new(); + private CancellationTokenSource _disposeTokenSource = new(); private ConnectionHubOptions _options = default!; @@ -37,30 +37,17 @@ protected override void OnInitialized() /// /// /// - protected override void OnAfterRender(bool firstRender) + protected override async Task OnAfterRenderAsync(bool firstRender) { - if (firstRender) - { - _ = Task.Run(async () => - { - while (!DisposeTokenSource.IsCancellationRequested) - { - try - { - await Task.Delay(1000, DisposeTokenSource.Token); - } - catch (TaskCanceledException) - { + await base.OnAfterRenderAsync(firstRender); - } - if (!DisposeTokenSource.IsCancellationRequested) - { - UpdateRuntime(); - await InvokeAsync(StateHasChanged); - } - } - }); + try + { + await Task.Delay(1000, _disposeTokenSource.Token); + UpdateRuntime(); + StateHasChanged(); } + catch { } } private void UpdateRuntime() @@ -73,8 +60,8 @@ private void Dispose(bool disposing) { if (disposing) { - DisposeTokenSource.Cancel(); - DisposeTokenSource.Dispose(); + _disposeTokenSource.Cancel(); + _disposeTokenSource.Dispose(); } } diff --git a/src/BootstrapBlazor.Server/Components/Components/FooterCounter.razor.css b/src/BootstrapBlazor.Server/Components/Components/FooterCounter.razor.css deleted file mode 100644 index 59415fa9555..00000000000 --- a/src/BootstrapBlazor.Server/Components/Components/FooterCounter.razor.css +++ /dev/null @@ -1,7 +0,0 @@ -.footer-online i { - color: var(--bs-success) -} - -.footer-online a { - color: #ddd; -} diff --git a/src/BootstrapBlazor.Server/Components/Layout/HomeLayout.razor b/src/BootstrapBlazor.Server/Components/Layout/HomeLayout.razor index e637fd5bc4e..38c5420f1fc 100644 --- a/src/BootstrapBlazor.Server/Components/Layout/HomeLayout.razor +++ b/src/BootstrapBlazor.Server/Components/Layout/HomeLayout.razor @@ -63,6 +63,7 @@
Powered by .NET @Version on @OS
BB @VersionService.Version
+
@Localizer["Footer"] diff --git a/src/BootstrapBlazor.Server/Extensions/ICacheEntryExtensions.cs b/src/BootstrapBlazor.Server/Extensions/ICacheEntryExtensions.cs index dcfa675daa6..c5fca810dd5 100644 --- a/src/BootstrapBlazor.Server/Extensions/ICacheEntryExtensions.cs +++ b/src/BootstrapBlazor.Server/Extensions/ICacheEntryExtensions.cs @@ -47,6 +47,16 @@ public static string GetExpiration(this ICacheEntry entry) private static TimeSpan GetSlidingLeftTime(this ICacheEntry entry) { var lastAccessed = entry.GetLastAccessed(); - return lastAccessed == null ? TimeSpan.Zero : entry.SlidingExpiration!.Value - (DateTime.UtcNow - lastAccessed.Value); + if (lastAccessed == null) + { + return TimeSpan.Zero; + } + + var ts = entry.SlidingExpiration!.Value - (DateTime.UtcNow - lastAccessed.Value); + if (ts < TimeSpan.Zero) + { + ts = TimeSpan.Zero; + } + return ts; } }