Skip to content

Commit f628eed

Browse files
committed
Merge branch 'main' into refactor-timer
2 parents bc48dfd + 075a1c3 commit f628eed

File tree

3 files changed

+58
-46
lines changed

3 files changed

+58
-46
lines changed

src/BootstrapBlazor/BootstrapBlazor.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk.Razor">
22

33
<PropertyGroup>
4-
<Version>9.5.11-beta05</Version>
4+
<Version>9.5.11-beta06</Version>
55
</PropertyGroup>
66

77
<ItemGroup>

src/BootstrapBlazor/Components/Speech/SpeechWave.razor.cs

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,10 @@ public partial class SpeechWave : IDisposable
2929
public Func<Task>? OnTimeout { get; set; }
3030

3131
/// <summary>
32-
/// 获得/设置 总时长 默认 60000 毫秒
32+
/// 获得/设置 总时长 默认 60 000 毫秒
3333
/// </summary>
3434
[Parameter]
35-
public int TotalTime { get; set; } = 60000;
36-
37-
private TimeSpan UsedTimeSpan { get; set; }
38-
39-
private CancellationTokenSource? Token { get; set; }
35+
public int TotalTime { get; set; } = 60 * 1000;
4036

4137
private string? ClassString => CssBuilder.Default("speech-wave")
4238
.AddClass("invisible", !Show)
@@ -49,71 +45,79 @@ public partial class SpeechWave : IDisposable
4945

5046
private string? TotalTimeSpanString => $"{TimeSpan.FromMilliseconds(TotalTime):mm\\:ss}";
5147

52-
private string? UsedTimeSpanString => $"{UsedTimeSpan:mm\\:ss}";
48+
private string? UsedTimeSpanString => $"{_usedTimeSpan:mm\\:ss}";
49+
50+
private bool _run;
51+
private TimeSpan _usedTimeSpan;
52+
private CancellationTokenSource? _token;
5353

5454
/// <summary>
55-
/// OnParametersSet 方法
55+
/// <inheritdoc/>
5656
/// </summary>
57-
protected override void OnParametersSet()
57+
/// <returns></returns>
58+
protected override async Task OnParametersSetAsync()
5859
{
59-
base.OnParametersSet();
60+
61+
await base.OnParametersSetAsync();
6062

6163
if (Show)
6264
{
63-
Run();
65+
await Run();
6466
}
6567
else
6668
{
67-
Cancel();
69+
Stop();
6870
}
6971
}
7072

71-
private bool IsRun { get; set; }
73+
private bool IsShow => _token is { IsCancellationRequested: false };
7274

73-
private void Run() => Task.Run(async () =>
75+
private async Task Run()
7476
{
75-
if (!IsRun)
77+
if (!_run)
7678
{
77-
IsRun = true;
78-
UsedTimeSpan = TimeSpan.Zero;
79-
Token ??= new CancellationTokenSource();
79+
_run = true;
80+
_usedTimeSpan = TimeSpan.Zero;
81+
_token ??= new CancellationTokenSource();
8082
while (IsShow)
8183
{
8284
try
8385
{
84-
await Task.Delay(1000, Token.Token);
85-
UsedTimeSpan = UsedTimeSpan.Add(TimeSpan.FromSeconds(1));
86-
if (UsedTimeSpan.TotalMilliseconds >= TotalTime)
86+
await Task.Delay(1000, _token.Token);
87+
_usedTimeSpan = _usedTimeSpan.Add(TimeSpan.FromSeconds(1));
88+
if (_usedTimeSpan.TotalMilliseconds >= TotalTime)
8789
{
8890
Show = false;
8991
if (OnTimeout != null)
9092
{
9193
await OnTimeout();
9294
}
9395
}
94-
await InvokeAsync(StateHasChanged);
96+
97+
if (ShowUsedTime || Show == false)
98+
{
99+
StateHasChanged();
100+
}
95101
}
96102
catch (TaskCanceledException)
97103
{
98104
break;
99105
}
100106
}
101-
IsRun = false;
107+
_run = false;
102108
}
103-
});
109+
}
104110

105-
private void Cancel()
111+
private void Stop()
106112
{
107-
if (Token != null)
113+
if (_token != null)
108114
{
109-
Token.Cancel();
110-
Token.Dispose();
111-
Token = null;
115+
_token.Cancel();
116+
_token.Dispose();
117+
_token = null;
112118
}
113119
}
114120

115-
private bool IsShow => Token != null && !Token.IsCancellationRequested;
116-
117121
/// <summary>
118122
/// Dispose 方法
119123
/// </summary>
@@ -122,7 +126,7 @@ protected virtual void Dispose(bool disposing)
122126
{
123127
if (disposing)
124128
{
125-
Cancel();
129+
Stop();
126130
}
127131
}
128132

test/UnitTest/Components/RecognizerTest.cs

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// See the LICENSE file in the project root for more information.
44
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone
55

6+
using System.Runtime.CompilerServices;
7+
68
namespace UnitTest.Components;
79

810
public class RecognizerTest : SpeechTestBase
@@ -79,29 +81,35 @@ public async Task SpeechWave_OnTimeout_Test()
7981
cut.SetParametersAndRender(pb =>
8082
{
8183
pb.Add(a => a.Show, true);
84+
pb.Add(a => a.ShowUsedTime, false);
8285
});
83-
await Task.Delay(500);
86+
await Task.Delay(1200);
87+
8488
cut.SetParametersAndRender(pb =>
8589
{
8690
pb.Add(a => a.Show, false);
8791
});
8892
}
8993

9094
[Fact]
91-
public void IsCancelled_Ok()
95+
public void Token_Ok()
9296
{
93-
var cut = Context.RenderComponent<SpeechWave>();
94-
var pi = cut.Instance.GetType().GetProperty("IsShow", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
95-
var tokenPi = cut.Instance.GetType().GetProperty("Token", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
97+
var cut = Context.RenderComponent<SpeechWave>(pb =>
98+
{
99+
pb.Add(a => a.Show, true);
100+
});
101+
var token = GetToken(cut.Instance);
102+
var shown = GetShow(cut.Instance);
103+
Assert.True(shown);
96104

97-
Assert.False((bool?)pi?.GetValue(cut.Instance));
105+
GetToken(cut.Instance) = null;
106+
shown = GetShow(cut.Instance);
107+
Assert.False(shown);
108+
}
98109

99-
var token = new CancellationTokenSource();
100-
tokenPi?.SetValue(cut.Instance, token);
101-
Assert.True((bool?)pi?.GetValue(cut.Instance));
110+
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_token")]
111+
static extern ref CancellationTokenSource? GetToken(SpeechWave @this);
102112

103-
token.Cancel();
104-
Assert.False((bool?)pi?.GetValue(cut.Instance));
105-
Context.DisposeComponents();
106-
}
113+
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = "get_IsShow")]
114+
static extern bool GetShow(SpeechWave @this);
107115
}

0 commit comments

Comments
 (0)