UI线程和后台线程使用相同的全局变量

时间:2013-02-14 16:55:12

标签: c# multithreading

我希望pictureBox1在UI(主线程)中显示CurrImage,同时在后台线程中修改CurrImage,这需要一些时间才能完成。当后台线程完成处理时,它应该将旧的CurrImage替换为pictureBox1中的这个新的。

1)我得到一个例外 2)我在UI线程中尝试了一个不同的图像变量,同时在后台线程中修改了CurrImage,并且效果很好。

如何管理两个线程以在同一个全局变量上运行? 提前致谢

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);
    }

1 个答案:

答案 0 :(得分: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);
    });
}

请参阅:Asynchronous Programming with Async and Await