Принципиальный молчун
Зарегистрирован: 24 April 2008
Сообщения: 2
Примеры кода: 0
|
Подвисает основной поток формы при работе с несколькими threads |
24 April 2008 16:12 |
|
|
|
|
Есть основная форма с интерфейсом.
Есть несколько потоков работающих параллельно и периодически забрасывающих данные в общую очередь.
Есть выделенный поток который в случае появления данных в очереди дает команду интерфейсу считать из базы данные и отобразить в гриде.
Есть таймер который раз в секунду обновляет лейбл на экране - просто часы.
В какой-то не поддающийся определению момент основной поток формы зависает. Т.е. форма перестает вообще обрабатывать сообщения - останавливает таймер (ибо работает от сообщений формы),
напрочь визуально зависает и не перерисовывается грид и т.д.
При этом все параллельные потоки поставщики данных продолжают работать и складывать данные, поток обновляющий форму успешно их подхватывает и дает форме команду BeginInvoke после чего выходит из обработки как и положено, но в потоке формы BeginInvoke не вызывает обработчик и соответственно ничего на экране не обновляет.
Что делать? Куда копать? Какие куски кода нужно предоставить для более детального анализа? Есть ли какие-то тонкости как можно отловить где конкретно сейчас повисла основная форма, может она ждет какой-то ресурс, как узнать какой?
delegate void dProceedEvent(int intId);
private void ProceedEvent(int id)
{
if (this.InvokeRequired)
{
cLog.WriteSQLLog(logPlaces.lpfrmMain, "Заход в обработку ИД");
dProceedEvent d = new dProceedEvent(ProceedEvent);
this.BeginInvoke(d, new object[] { id });
return;
}
try
{
//работа с базой и работа с гридом через bindingsource
//никаких залочек здесь не используется
//единственное что настораживает не приводит ли к проблемам использование статичных функций класса
//здесь местами вызывается логгер но там стоит проверка по которой просто возвращается обратно
}
catch (Exception ex)
{
cLog.WriteSQLLog(logPlaces.lpfrmMain, "Выход из обработки ИД с ошибкой " + ex.StackTrace.ToString() + " " + ex.ToString());//этот вызов внутри проверяет переменную и возвращается обратно
cLog.WriteLog("Выход из обработки ИД с ошибкой " + ex.StackTrace.ToString() + " " + ex.ToString());//вот этот код реально пишет в текстовый файл
}
}
Данное сообщение получено с сайта GotDotNet.RU
Последний раз редактировалось 24 April 2008 16:12
|
|