diff --git a/src/BootstrapBlazor/Components/Timer/Timer.razor.cs b/src/BootstrapBlazor/Components/Timer/Timer.razor.cs index e6449af01ab..f739e9373ca 100644 --- a/src/BootstrapBlazor/Components/Timer/Timer.razor.cs +++ b/src/BootstrapBlazor/Components/Timer/Timer.razor.cs @@ -168,7 +168,7 @@ private async Task Timeout() } } - private Task OnStart(TimeSpan val) + private async Task OnStart(TimeSpan val) { Value = val; IsPause = false; @@ -176,60 +176,54 @@ private Task OnStart(TimeSpan val) AlertTime = DateTime.Now.Add(CurrentTimespan).ToString("HH:mm:ss"); StateHasChanged(); + await Task.Yield(); - _ = Task.Run(async () => + // 点击 Cancel 后重新设置再点击 Star + if (CancelTokenSource.IsCancellationRequested) { - // 点击 Cancel 后重新设置再点击 Star - if (CancelTokenSource.IsCancellationRequested) + CancelTokenSource.Dispose(); + CancelTokenSource = new CancellationTokenSource(); + } + + while (!CancelTokenSource.IsCancellationRequested && CurrentTimespan > TimeSpan.Zero) + { + try { - CancelTokenSource.Dispose(); - CancelTokenSource = new CancellationTokenSource(); + await Task.Delay(1000, CancelTokenSource.Token); } + catch (TaskCanceledException) { } - while (!CancelTokenSource.IsCancellationRequested && CurrentTimespan > TimeSpan.Zero) + if (!CancelTokenSource.IsCancellationRequested) { - try - { - await Task.Delay(1000, CancelTokenSource.Token); - } - catch (TaskCanceledException) { } - - if (!CancelTokenSource.IsCancellationRequested) - { - CurrentTimespan = CurrentTimespan.Subtract(TimeSpan.FromSeconds(1)); - await InvokeAsync(StateHasChanged); - } + CurrentTimespan = CurrentTimespan.Subtract(TimeSpan.FromSeconds(1)); + StateHasChanged(); + } - if (IsPause) - { - ResetEvent.WaitOne(); - AlertTime = DateTime.Now.Add(CurrentTimespan).ToString("HH:mm:ss"); + if (IsPause) + { + ResetEvent.WaitOne(); + AlertTime = DateTime.Now.Add(CurrentTimespan).ToString("HH:mm:ss"); - // 重建 CancelToken - CancelTokenSource.Dispose(); - CancelTokenSource = new CancellationTokenSource(); - } + // 重建 CancelToken + CancelTokenSource.Dispose(); + CancelTokenSource = new CancellationTokenSource(); } + } - if (CurrentTimespan == TimeSpan.Zero) + if (CurrentTimespan == TimeSpan.Zero) + { + await Task.Delay(500, CancelTokenSource.Token); + if (!CancelTokenSource.IsCancellationRequested) { - await Task.Delay(500, CancelTokenSource.Token); - if (!CancelTokenSource.IsCancellationRequested) + Value = TimeSpan.Zero; + Vibrate = IsVibrate; + StateHasChanged(); + if (OnTimeout != null) { - Value = TimeSpan.Zero; - await InvokeAsync(async () => - { - Vibrate = IsVibrate; - StateHasChanged(); - if (OnTimeout != null) - { - await OnTimeout(); - } - }); + await OnTimeout(); } } - }); - return Task.CompletedTask; + } } private void OnClickPause()