動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About
C#

定石4: IProgressで進捗をUIに細かく反映

出典: WinForms 非同期処理の正解 — BackgroundWorker / Task.Run / async-await の使い分け定石4: IProgressで進捗をUIに細かく反映

定石4: IProgressで進捗をUIに細かく反映 (csharp)#fa2904c0a651
// ✅定石4: IProgress<T>で進捗報告(async-await版BackgroundWorker.ReportProgress)
using System;
using System.Threading.Tasks;
 
public partial class ImportForm : Form
{
    private async void btnStart_Click(object sender, EventArgs e)
    {
        btnStart.Enabled = false;
        progressBar1.Value = 0;
 
        // Progress<T>は内部でControl.Invoke相当を行う(UIスレッドに自動復帰)
        var progress = new Progress<int>(percent =>
        {
            progressBar1.Value = percent;
            lblPercent.Text = $"{percent}%";
        });
 
        try
        {
            await Task.Run(()=> DoHeavyWork(progress));
            lblStatus.Text = "完了";
        }
        finally
        {
            btnStart.Enabled = true;
        }
    }
 
    private void DoHeavyWork(IProgress<int> progress)
    {
        for (int i = 0; i < 100; i++)
        {
            Thread.Sleep(50);
            progress?.Report(i + 1);   //進捗報告(UIスレッドで反映される)
        }
    }
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
  • id: #fa2904c0a651
  • lines: 38
  • extracted: 2026-06-10

Source収録記事

この snippet は記事の「定石4: IProgressで進捗をUIに細かく反映」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。

同じ記事から

5
図鑑トップ