1.xaml
<Button Width="100" Margin="0,0,0,10" Content="Run" Click="Button_Click" />
<ProgressBar Height="20" d:Value="10" Name="progressBar" />
2.cs
private async void Button_Click(object sender, RoutedEventArgs e)
{
var reporter = new MyProgress<double>(
value => progressBar.Value = value,
() => progressBar.Visibility = Visibility.Hidden,
100
);
await DoJobAsync(reporter, CancellationToken.None);
//进度条完了 才会运行
testbox.Text = "2";
}
async Task DoJobAsync(IProgress<double> reporter, CancellationToken token)
{
for (int i = 0; i < 50; i++)
{
if (token.IsCancellationRequested)
return;
await Task.Delay(50, token).ConfigureAwait(true);
testbox.Text = i.ToString();
//Debug.WriteLine(i);
reporter.Report(i + i+10);
//reporter.Report(10);
if (token.IsCancellationRequested)
{
break;
}
}
}
3.封装的progress
class MyProgress<T> : Progress<T> where T : notnull
{
private readonly Action? _complete;
private readonly T _maximum;
private bool _isCompleted;
public MyProgress(Action<T> handler, Action? complete, T maximum)
: base(handler)
{
_complete = complete;
_maximum = maximum;
ProgressChanged += CheckCompletion;
}
protected override void OnReport(T value)
{
if (_isCompleted)
return;
base.OnReport(value);
}
private void CheckCompletion(object? sender, T e)
{
if (e.Equals(_maximum) && !_isCompleted)
{
_isCompleted = true;
_complete?.Invoke();
}
}
}