2013-02-14 2 views
0

Я хочу, чтобы pictureBox1 отображал CurrImage в пользовательском интерфейсе (основной поток), и в то же время CurrImage должен быть изменен в фоновом потоке, для завершения которого требуется некоторое время. Когда обработка завершена фоновым потоком, она должна заменить старый CurrImage на новый в pictureBox1.UI thread and background thread use same Глобальная переменная

1) Я получаю исключение 2) Я попробовал другую переменную изображения в потоке пользовательского интерфейса при изменении 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

Сообщение исключение –

+0

Является ли это WPF или формы? Это .NET 4.5 или какой-то более старый вариант? Пожалуйста, используйте теги вопросов – GregC

+0

Я использую .NET 4. Это исключение, которое я получаю «Первое случайное исключение типа« System.InvalidOperationException »произошло в System.Drawing.dll« Фактически в списке «изображения», если я смену индекс, так что фоновый поток и основной поток обрабатывают два разных изображения, он отлично работает. Но если я делаю оба потока обрабатывать одни и те же изображения каждый раз, когда я нажимаю дальше, он удастся только случайно. Я попытался также получить доступ к элементам пользовательского интерфейса из фонового потока Invoke ((Action) (() => {this.pictureBox1.Image = Iprocessing.Colour_style1 ((Bitmap) CurrImage);})); – Basco

ответ

2

Simple: не имеют доступа к 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

+0

Спасибо за ваш ответ. Когда я добавил async, я получаю эту ошибку - «Недопустимый токен void» в объявлении члена класса, структуры или интерфейса «\t, а также для Task.Run, я получаю« ожидаемую точку с запятой ». Кстати, я использую окна в .NET Framework 4.0, и я новичок. Также из моего первоначального сообщения я попытался получить доступ к элементам пользовательского интерфейса в рабочем потоке, используя Invoke ((Action) (() => {this.pictureBox1.Image = Iprocessing.Colour_style1 ((Bitmap) CurrImage);})); Но он все еще не работает. – Basco