2013-02-14 80 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