C#でバックグラウンド処理をするためのテンプレート
C#でバックグラウンド処理をするためのテンプレート
時間のかかる処理をバックグラウンドで実行するには?[2.0のみ、C#、VB] - @IT
バックグラウンド処理を途中でキャンセルするには?[2.0のみ、C#、VB] - @IT
using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; namespace WindowsFormsApp1 { /// <summary> /// ユーザ定義のBackgroundWorkerクラス /// 処理中のデータを保持させたりしたい /// </summary> public class MyBackgroundWorker : BackgroundWorker { public int id; public int count; public MyBackgroundWorker(int id) { this.id = id; this.count = 0; } } public partial class Form1 : Form { public Form1() { InitializeComponent(); // 増産方法 List<BackgroundWorker> workers = new List<BackgroundWorker>(); int workers_number = 10; for (int i = 0; i < workers_number; i++) { BackgroundWorker new_worker = new MyBackgroundWorker(i); new_worker.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); new_worker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); new_worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); workers.Add(new_worker); } } /// <summary> /// ワーカーの起動 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(100); // 引数を渡している } /// <summary> /// キャンセル操作 /// </summary> private void button_Cancel_Click(object sender, EventArgs e) { backgroundWorker1.CancelAsync(); } /// <summary> /// バックグラウンド処理 /// </summary> private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { int bgWorkerArg = (int)e.Argument; BackgroundWorker worker = (BackgroundWorker)sender; for (int i = 0; i < bgWorkerArg; i++) { if (backgroundWorker1.CancellationPending) { e.Cancel = true; return; } System.Threading.Thread.Sleep(100); int percentage = (int)(100.0 * i / (bgWorkerArg - 1)); worker.ReportProgress(percentage); } e.Result = "All Collect!"; } /// <summary> /// 定期監視 /// </summary> private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; } /// <summary> /// 完了イベント /// </summary> private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { BackgroundWorker worker = (BackgroundWorker)sender; if (e.Cancelled) { this.textBox1.Text = "キャンセルされました"; } else { this.textBox1.Text = e.Result.ToString(); } progressBar1.Value = 0; } } }