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


Автор: _Jesus 21.1.2008, 10:51
Привет всем. 
Возникла такая проблема:
Есть два потока. Первый (основной) работает с формой. Второй (буду называть его "рабочий") совершает некоторую работу, в цикле.
Форма со всеми элементами создаётся в основном потоке, поэтому для обновления её из рабочего потока использую анонимный делегат. 
Рабочий поток проходит четыре круга цикла без проблем. Потом я делаю остновному потоку join рабочего и раняю рабочий поток по исключению. В catch он заходит, но вот после он должен сделать invoke и когда я нажимаю f10 он просто пропадает не известно куда.  smile 
В общих чертах
Код


miGridAddRow = new MethodInvoker(delegate()
{
    ...
});

try
{
    ...
}
catch(...)
{
    ...
}
dgGrid.Invoke(miGridAddRow);     // куда он отсюда девается?

Дело в том, что после нажатия f10 рабочий поток не приходит в miGridAddRow. И по исключению не падает. И основной поток, не стартует, а значит рабочий поток не завершился. 
В чём может быть дело? 

Автор: mr.DUDA 21.1.2008, 10:52
Может рабочий поток просто висит (цикл выполняет или ещё что-нибудь)...

Автор: _Jesus 22.1.2008, 12:19
Есть подозрение, что зависание происходит потому, что рабочий поток пытается вызвать делегат, для обращения к форме, которая была создана в основном потоке. А этот основной поток к тому времени уже сидит в Join.

Пока предворительный вывод. Надо ещё проверить...

Автор: mr.DUDA 22.1.2008, 17:55
Для таких случаев можно делать Join с параметром:
Код
thread.Abort(); 
thread.Join(0);

Автор: _Jesus 23.1.2008, 10:39
Делегат не вызывался потому, что поток, в котором создавалась форма был в это время остановлен.

А имеет ли смысл указывать после Abort Join(0)? Он же ждать ничего не будет.

Автор: mr.DUDA 23.1.2008, 12:23
Ну можно не 0 а например 100 поставить  smile 

Вообще если есть баг, надо фиксить баг а не аборты делать конечно же  smile 

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