回答編集履歴

1 追記

catsforepaw

catsforepaw score 5819

2016/11/08 20:22  投稿

値を変化させる度に毎回「新規にビットマップを生成」していれば重くなるのは当然です。普通はそのようなことはしません。不必要なマルチスレッド化は問題をややこしくするだけなのでお勧めしません
通常はPictureBoxにあらかじめビットマップオブジェクトを設定しておき、変化が起こったらそのビットマップに対して描画処理を行うようにします。単純な図形の描画でしたらマイクロ秒の世界です。
PictureBoxへのビットマップオブジェクトの設定
```C#
pictureBox1.Image = new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height);
```ご質問のコードだとコントロール類の設定をコンストラクタで行っていますが、それだと正しく設定されない場合があるので、`Load`イベントで行うべきです。
ビットマップの描画はこんな感じになります。直接`numericUpDown1_Changed`メソッド内に書いてもかまいません。
```C#
using(var g = Graphics.FromImage(pictureBox1.Image))
{
   g.Clear(背景の色);
   g.FillRectangle(Brushes.Red, new Rectangle(0, 0, length, length));
}
pictureBox1.Invalidate();   // ←これを書かないと表示が更新されない
```
```
---
追記
連続する何らかのイベントに反応して重い処理をさせたい、ただし、間に合わない場合は端折ってもいい、というような処理をしたい場合は、私はだいたいこんなコードを書きます。
ビットマップを2枚用意するのは、いわゆるダブルバッファリングというやつです。ただ、描画処理がすごく重くてビットマップの生成やガベージコレクションにかかる時間など無視できるなら、毎回生成してPictureBoxにセットする方法でも問題ないかもしれません。
```C#
private void Form1_Load(object sender, EventArgs e)
{
       :
       :
   doubleBuffer[0] = new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height);
   doubleBuffer[1] = new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height);
   showIndex = 0;
   backgroundWorker1.RunWorkerAsync();
}
private void numericUpDown1_Changed(object sender, EventArgs e)
{
   lastLength = Convert.ToInt32(numericUpDown1.Value);
   changeNotify.Set();
}
private int lastLength;
private AutoResetEvent changeNotify = new AutoResetEvent(false);
private Bitmap[] doubleBuffer = new Bitmap[2];
private int showIndex;
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
   while(true)
   {
       changeNotify.WaitOne();
       if(backgroundWorker1.CancellationPending )
           break;
       int length = lastLength;
       // 表示中でない方のビットマップに対して描画処理を行う
       int drawIndex = showIndex ^ 1;
       var drawBuffer = doubleBuffer[drawIndex];
       // 重い描画処理
           :
           :
       // 描画したビットマップをPictureBoxに設定して表示を更新
       pictureBox1.Image = drawBuffer;
       showIndex = drawIndex;
       this.Invoke(new Action(pictureBox1.Invalidate));
   }
}
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る