Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Многопоточность в WinForms


Автор: IBS 5.4.2012, 23:57
Приветствую!
Вот что получается:
Елементы управления windows forms выполняются в одном потоке. Мне же необходимо создать отдельный поток( в моем случае для рассылки писем по многим адресам). При этом было бы неплохо как-то наблюдать количесво отправленных писем в форме. Но обращаться к элементам формы из нового потока нельзя...

Нашел, что для этого вроде используют Dispatcher, пытаюсь делать так:
Код

            //Dispatcher.Run(); //бесполезная попытка
            var Dsp = Dispatcher.CurrentDispatcher;
            Dsp.Invoke(new MyDelegate(Sending));

Внутри метода Sending есть такие строки:
Код

                    notSuccessfully = notSuccessfully + 1;
                    labelNotSendedInt.Text = notSuccessfully.ToString(); //пытаюсь запихать текст в label объявленный в основном потоке

Выходит, что метод запускается в отдельном потоке и даже работает, но при этом блокируется сама форма. Т.е. толку от этого потока ноль. Пытался добавить перед ним Dispatcher.Run(), хотя это уже больше от отчаяния =) Что здесь можно сделать??

Автор: Cheloveck 6.4.2012, 01:13
http://msdn.microsoft.com/en-us/library/ms171728.aspx

Автор: IBS 6.4.2012, 09:11
Cheloveck, Большое спасибо за статью! Все получилось! Сам раз десять мимо нее проходил и не разу до конца не дочитывал, а там оказывается все что надо =)) 

Автор: IBS 6.4.2012, 12:11
Вылезла другая проблема:
Внутри нового потока есть блоки try catch. Если операция проходит, то, через метод Invoke, в label формы записываем, что она прошла, если нет то возникает исключение и передается управление блоку Catch в котором происходит запись в label формы который отображает неудачные операции.

Проблема в том, что при возникновении исключения в первый раз все происходит как и ожидалось: происходит запись в label(пишу туда число неудачных на данный момент операций), во второй и все последующие этого не происходит. 

Хотя когда я пытаюсь пройти по F11 все, на первый взгляд, идет: заходим в cath доходим до label.Invoke(...) и переходим на новую итерацию цикла.
Может тут какой-то наворот при обработке исключений при использовании Invoke, но я по этой теме ничего не нашел...

Автор: Cheloveck 6.4.2012, 19:35
Цитата(IBS @  6.4.2012,  13:11 Найти цитируемый пост)
Может тут какой-то наворот при обработке исключений при использовании Invoke

Нет никаких наворотов. Проверяй свой код.

Автор: IBS 8.4.2012, 18:26
Cheloveck, Опять вы были правы!! ) 
Оказалось, похожие методы копировал и натупил!

copyPast - зло (паттерн)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)