WPF: Отображение прогресса с помощью async/await

В ранних примерах по работе с ProgressBar в WPF рекомендовалось использовать BackgroundWorker.
Вот здесь достаточно простой и понятный пример с использованием ProgressBar и BackgroundWorker. Однако он довольно сильно устарел и в настоящее время BackgroundWorker для этих целей не используется. Вместо него можно использовать Progress и Task.

Пример

MainWindow.xaml
<Window x:Class="ReportProgressDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ReportProgressDemo"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
		<Button Height="65" Width="150" Margin="15" Click="Button_Click">Loop through numbers</Button>
		<ProgressBar x:Name="_progressBar" Height="25" Width="300" Margin="15"></ProgressBar>
		<TextBlock x:Name="_textBlock" Text="Start" FontSize="48" Margin="15" HorizontalAlignment="Center" VerticalAlignment="Center"/>
	</StackPanel>
</Window>
MainWindow.xaml.cs
using System.Windows;

namespace ReportProgressDemo
{
	/// <summary>
	/// Interaction logic for MainWindow.xaml
	/// </summary>
	public partial class MainWindow : Window
	{
		public MainWindow()
		{
			InitializeComponent();
		}

		private async void Button_Click(object sender, RoutedEventArgs e)
		{
			var progress = new Progress<int>(value =>
			{
				_progressBar.Value = value;
				_textBlock.Text = $"{value}%";
			});

			await Task.Run(() => LoopThroughNumbers(100, progress));

			_textBlock.Text = "Completed";
		}

		private void LoopThroughNumbers(int count, IProgress<int> progress)
		{
			for (int x = 0; x < count; x++)
			{
				Thread.Sleep(100);
				var percentComplete = (x * 100) / count;
				progress.Report(percentComplete);
			}
		}
	}
}

На заметку — в этом видео добавлена поддержка отмены задачи:



Подписаться
Уведомление о
guest
0 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments