2013-02-14 83 views
0

我想pictureBox1在UI(主线程)中显示CurrImage,同时CurrImage将在后台线程中修改,这需要一段时间才能完成。当后台线程完成处理时,它应该将旧的CurrImage替换为pictureBox1中的新的CurrImage。UI线程和后台线程使用相同全局变量

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

帖子异常 – 2013-02-14 16:57:27

+0

这是WPF或形式?这是.NET 4.5还是一些老版本?请使用问号标签 – GregC 2013-02-14 17:04:29

+0

我正在使用.NET 4. 这是我得到的异常“System.Drawing.dll中发生类型'System.InvalidOperationException'的第一次机会异常” 实际上,如果我移动列表中的“图像”该索引使后台线程和主线程处理两个不同的图像,它工作正常。但是,如果我让两个线程每次点击下一个图像时处理相同的图像,它只会偶然成功。我试图从后台线程访问UI元素Invoke((Action)(()=> {this.pictureBox1.Image = Iprocessing.Colour_style1((Bitmap)CurrImage);})); – Basco 2013-02-15 04:37:43

回答

2

简单:不要从后台线程访问图片框。

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

+0

感谢您的回复。 当我添加异步我得到这个错误 - “在类,结构,或接口成员声明”\t“也无效令牌'无效',也为Task.Run,​​我得到 - ”预期分号“错误。 顺便说一句,我在.net框架4.0中使用Windows窗体,我是一个初学者。我尝试使用 Invoke((Action)((=){this.pictureBox1.Image = Iprocessing.Colour_style1((Bitmap)CurrImage);})来访问工作线程中的UI元素。 ); 但它仍然无法正常工作。 – Basco 2013-02-15 03:47:25