Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по многопоточности 
:(
    Опции темы
Stas123
Дата 5.7.2011, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



Есть приложение WPF. В нем с помощью BackgroundWorker происходит работа.
Время от времени, эта работа в потоке BackgroundWorker генерит свои результаты, которые я хочу вывести на экран сразу, а не дожидаясь окончания работы потока. Я пытался вывести их так - добавить в ObservableCollection и вывести через ListView и DisplayMemberBinding. Но оказалось ,что нельзя обновить элементы окна не из потока диспетчера. Поэтому я сделал так.
Код

this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, 

(ThreadStart) delegate()
                                        

        {Mydata.Add(data);});

все это находится в цикле и вызывается несколько раз.
Скажите, правильное ли это решение и не нужно ли тут как-то отсоединяться от потока окна диспетчера, с  учетом того, 
что данный код выполняется несколько раз до оконания работы потока BackgroundWorker ?
PM MAIL   Вверх
ДобренькийПапаша
Дата 5.7.2011, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 2
Всего: 7



Цитата(Stas123 @  5.7.2011,  10:04 Найти цитируемый пост)
Скажите, правильное ли это решение и не нужно ли тут как-то отсоединяться от потока окна диспетчера, с  учетом того, 
что данный код выполняется несколько раз до оконания работы потока BackgroundWorker ? 

Да я, вроде бы, ничего не отсоединял smile И так должно работать. А вот это по теме:
Создание быстро реагирующих многопоточных приложений WPF



--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Brilona
Дата 5.7.2011, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 8.7.2008

Репутация: 2
Всего: 3



Думаю, что промежуточные результаты работы BackgroundWorker'а нужно выводить в обработчике события ProgressChanged, которое возникает при вызове метода ReportProgress. Тут есть пример.
PM MAIL ICQ   Вверх
ДобренькийПапаша
Дата 5.7.2011, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 2
Всего: 7



Цитата(Brilona @  5.7.2011,  10:12 Найти цитируемый пост)
Думаю, что промежуточные результаты работы BackgroundWorker'а нужно выводить в обработчике события ProgressChanged, которое возникает при вызове метода ReportProgress. Тут есть пример. 

Так код, который привёл топикстартер, видимо и находится в ProgressChanged)))


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Stas123
Дата 5.7.2011, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



Цитата(ДобренькийПапаша @  5.7.2011,  10:17 Найти цитируемый пост)
Так код, который привёл топикстартер, видимо и находится в ProgressChanged))) 
 Нет, не находится. Вроде нормально работает. А лучше поместить в ProgressChanged ?
PM MAIL   Вверх
ДобренькийПапаша
Дата 5.7.2011, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 2
Всего: 7



Цитата(Stas123 @  5.7.2011,  10:22 Найти цитируемый пост)
Нет, не находится. Вроде нормально работает. А лучше поместить в ProgressChanged ? 

Было бы логично.


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
-Mikle-
Дата 7.7.2011, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 13
Всего: 59



Цитата(Stas123 @  5.7.2011,  13:22 Найти цитируемый пост)
А лучше поместить в ProgressChanged 

И не придется тогда использовать диспетчер. Событие ProgressChanged возникает в основном потоке.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Stas123
Дата 14.7.2011, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



-Mikle-,  а как мне передать data, который я хочу положить в коллекцию в backgroundWorker_ProgressChanged?
PM MAIL   Вверх
Brilona
Дата 15.7.2011, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 8.7.2008

Репутация: 2
Всего: 3



Событие ProgressChanged возникает при вызове метода ReportProgress.

Код

worker.ReportProgress(i * 10, data);


Код

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //здесь можно получить data из e.UserState
}


PM MAIL ICQ   Вверх
Stas123
Дата 15.7.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



у меня почему-то не работает.
Код

if (_backgroundWorker.WorkerReportsProgress){
                    MessageBox.Show(_backgroundWorker.WorkerReportsProgress.ToString());
                    _backgroundWorker.ReportProgress(1, data);
                }
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            MyData data= (MyData ) e.UserState;
            MessageBox.Show(data.ToString());
        }

Даже так.
Код

if (_backgroundWorker.WorkerReportsProgress){
                    MessageBox.Show(_backgroundWorker.WorkerReportsProgress.ToString());
                    _backgroundWorker.ReportProgress(1);
                }

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            MessageBox.Show("Ok");
            
        }


(_backgroundWorker.WorkerReportsProgress == true

Это сообщение отредактировал(а) Stas123 - 15.7.2011, 11:40
PM MAIL   Вверх
Brilona
Дата 15.7.2011, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 8.7.2008

Репутация: 2
Всего: 3



Лучше бы написали КАК не работает. В сообщениях выводится не то, что вы ожидали? Возможно вообще какое-то из сообщений не выводится? В определенном месте появляется exception? 

P.S. Как мне кажется, сообщение в этой части
Код

if (_backgroundWorker.WorkerReportsProgress){
                    MessageBox.Show(_backgroundWorker.WorkerReportsProgress.ToString());
                    _backgroundWorker.ReportProgress(1, data);
                }

не должно отобразиться, потому как действия происходят в другом потоке.
PM MAIL ICQ   Вверх
Stas123
Дата 15.7.2011, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



Код


if (_backgroundWorker.WorkerReportsProgress){
                    MessageBox.Show(_backgroundWorker.WorkerReportsProgress.ToString());
                    _backgroundWorker.ReportProgress(1, data);
                }


Здесь сообщение выводится.
Не выводится сообщение , которое должно возникать, когда происходит обработка события ProgressChanged и не происходит ничего из того, что находится в этом методе.
PM MAIL   Вверх
Brilona
Дата 15.7.2011, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 8.7.2008

Репутация: 2
Всего: 3



Такая строка присутствует в коде?

Код

_backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);

PM MAIL ICQ   Вверх
Stas123
Дата 15.7.2011, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



нет.
PM MAIL   Вверх
Stas123
Дата 19.7.2011, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



Brilona, ,Спасибо ,теперь все работает.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.1476 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.