0

私は、pictureBox1 に UI (メイン スレッド) で CurrImage を表示させ、同時に CurrImage をバックグラウンド スレッドで変更する必要があるため、完了するまでに時間がかかります。バックグラウンド スレッドが処理を終了すると、古い CurrImage が pictureBox1 内の新しい CurrImage に置き換えられます。

1) 例外が発生しました。2) バックグラウンド スレッドで CurrImage を変更しているときに、UI スレッドで別の画像変数を試してみましたが、うまくいきました。

両方のスレッドが同じグローバル変数で実行されるようにするにはどうすればよいですか? 前もって感謝します

private Image CurrImage; int index;

private void button4_Click(object sender, EventArgs e) {

        index++;
        if (index >= images.Count) index = 0;
        CurrImage = images[index]; if (!bkGrndWker2.IsBusy)  bkGrndWker2.RunWorkerAsync();
        pictureBox1.Image = CurrImage;    
    }


   private void bkGrndWker2_DoWork(object sender, DoWorkEventArgs e)
    {
        this.pictureBox1.Image = Iprocessing.Colour_style1((Bitmap)CurrImage);
    }
4

1 に答える 1

2

シンプル: バックグラウンド スレッドから PictureBox にアクセスしないでください。

private int index;

private async void button4_Click(object sender, EventArgs e) 
{ //      ↑
    index++;
    if (index >= images.Count) index = 0;
    var bitmap = (Bitmap)images[index];

    pictureBox1.Image = bitmap;
    pictureBox1.Image = await Task.Run(() =>
    { //                  ↑
        return Iprocessing.Colour_style1(bitmap);
    });
}

参照: Async と Await を使用した非同期プログラミング

于 2013-02-14T17:01:46.757 に答える