0

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

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