Progress<T>를 사용해서 진행도 표시
작성날짜 2025/05/19
코드
//XAML
<Grid>
<TextBlock Name="tbProgress"/>
<ProgressBar Name="ProgressBar" Width="300" Height="30"/>
</Grid>
//코드 비하인드
public MainWindow()
{
InitializeComponent();
}
static async Task TestAsync(IProgress<int> progress)
{
for (int i = 0; i <= 100; i += 10)
{
await Task.Delay(500); // 작업 시뮬레이션
progress.Report(i); // 진행률 보고
}
}
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
IProgress<int> progress = new Progress<int>(prog =>
{
// UI 스레드에서 진행률 업데이트
ProgressBar.Value = prog;
tbProgress.Text = $"{prog}%";
});
await TestAsync(progress);
}
결과
오래 걸리는 작업(TestAsync)은 테스크로 처리되어 UI 스레드가 막히지 않는다.
위 코드는 너무 간단해서 오히려 어렵게 느껴질 지경인데
progress.Report(i)로 진행도를 보고 하면 new Progress(Action handler)에서 넘겨준 Action이 실행된다.