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

定石1: BackgroundWorker —旧式だがDesigner配置できる

出典: WinForms 非同期処理の正解 — BackgroundWorker / Task.Run / async-await の使い分け定石1: BackgroundWorker —旧式だがDesigner配置できる

定石1: BackgroundWorker —旧式だがDesigner配置できる (csharp)#b0579a8291a4
// ✅定石1: BackgroundWorkerでファイル取り込み
using System.ComponentModel;
 
public partial class ImportForm : Form
{
    private BackgroundWorker _worker;
 
    public ImportForm()
    {
        InitializeComponent();
 
        _worker = new BackgroundWorker
        {
            WorkerReportsProgress = true,
            WorkerSupportsCancellation = true,
        };
        _worker.DoWork += Worker_DoWork;
        _worker.ProgressChanged += Worker_ProgressChanged;
        _worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
    }
 
    private void btnStart_Click(object sender, EventArgs e)
    {
        _worker.RunWorkerAsync();
    }
 
    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
        //バックグラウンドスレッドで動く(UI触れない)
        for (int i = 0; i < 100; i++)
        {
            if (_worker.CancellationPending){ e.Cancel = true; return; }
            Thread.Sleep(50);
            _worker.ReportProgress(i + 1);
        }
    }
 
    private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        // UIスレッドで動く(直接コントロール触れる)
        progressBar1.Value = e.ProgressPercentage;
    }
 
    private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Error != null){ MessageBox.Show($"エラー: {e.Error.Message}"); return; }
        if (e.Cancelled){ lblStatus.Text = "キャンセルされました"; return; }
        lblStatus.Text = "完了";
    }
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
  • id: #b0579a8291a4
  • lines: 50
  • extracted: 2026-06-10

Source収録記事

この snippet は記事の「定石1: BackgroundWorker —旧式だがDesigner配置できる」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。

同じ記事から

5
図鑑トップ