Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > ОШИБКА (ничего не понимаю)


Автор: HellMasterHaiL 1.2.2007, 15:15
привет всем!)

вот столкнулся с такой вот ошибкой:
Цитата

CLR не удалось перейти из COM-контекста 0x1a09a0 в COM-контекст 0x1a0b10 за 60 секунд. Наиболее вероятно, что поток, владеющий контекстом/апартаментом назначения, находится в режиме ожидания или выполнения очень длительной операции без прокачки сообщений Windows. Обычно эта ситуация отрицательно влияет на производительность и даже может привести к зависанию приложения или чрезмерному расходованию памяти. Чтобы избежать этой проблемы, все потоки однопоточного апартамента (STA) должны использовать примитивы ожидания для прокачки (например, CoWaitForMultipleHandles) и периодически прокачивать сообщения во время длительных операций.


самое инетересное, не указывается в какой строке ошибка, не могу отловить даже в каком месте процедуры ЭТО возникает, т.к. ошибка вылазить не каждый раз (так же не могу определить в какой ситуции ЭТО происходит, один раз компилю - все нормально, второй раз - ЭТО)

пишу на 2005й студии, в процедуре есть пару циклов и также филю несколько таблиц в датасете. как я понимаю, подобная ошибка может возникать в циклических блоках...

так вот вопрос, как это обойти/исправить и что вообще CoWaitForMultipleHandles

Автор: ivashkanet 1.2.2007, 16:16
 smile HellMasterHaiL, темы нужно называть в соответствии с их смыслом  smile  
 smile Название темы должно отражать ее суть smile 

Цитата(HellMasterHaiL @  1.2.2007,  14:15 Найти цитируемый пост)
CoWaitForMultipleHandles

У нас это, скорее всего, будет Aplication.DoEvents(), расставленное в критических местах программы.
Эта процедура поможет
Цитата(HellMasterHaiL @  1.2.2007,  14:15 Найти цитируемый пост)
периодически прокачивать сообщения во время длительных операций

Пример:
Код

While True
 // что-то делаем не очень громоздкое
 Application.DoEvents()
End While


Либо производить эти действия в другом потоке

Автор: HellMasterHaiL 1.2.2007, 16:39
ivashkanet, извини, но как обозвать тему я так и не сообразил...

спасибо, но как узнать в какие места необходимо сунуть Application.DoEvents()?
а если еще эти места находятся внутри кода, сгенерированного конструктором?

Автор: ivashkanet 1.2.2007, 16:45
Цитата(HellMasterHaiL @  1.2.2007,  15:39 Найти цитируемый пост)
а если еще эти места находятся внутри кода, сгенерированного конструктором?

Как вообще такое может быть?
Ты видел чтобы конструктор использовал циклы или трудоемкие процедуры?
Единственное что он делает --- это создание компонентов, расположение их на форме и изменение их свойств.
Цитата(HellMasterHaiL @  1.2.2007,  15:39 Найти цитируемый пост)
 но как узнать в какие места необходимо сунуть Application.DoEvents()?

В тех местах где ты выполняешь длительные и ресурсоемкие операции. Чтение из базы, обработка данных, ...


Цитата(HellMasterHaiL @  1.2.2007,  15:39 Найти цитируемый пост)
ivashkanet, извини,

Это просто правила, причем тут я smile 
Цитата(HellMasterHaiL @  1.2.2007,  15:39 Найти цитируемый пост)
как обозвать тему я так и не сообразил...

Например: Ошибка "не удалось перейти из COM-контекста 0x1a09a0 в COM-контекст 0x1a0b10 за 60 секунд" (разделить на две строчки)


Автор: HellMasterHaiL 1.2.2007, 17:19
ivashkanet, чтение из БД я произвожу штатными (конструкторскими) способами, есть парочка запросов, которые читают большой объем инфы(я бы сказал очень большой, т.к. для некоторых ТейблАдаптеров пришлось вручную увеличивать КоннекшенТаймАут), а в коде это занимает всего навсего одну строчку :
Код

lc_Count = Me.CheloveckTableAdapter.Fill(Me.DS_SocDefence.Cheloveck)

и есть у меня предположения (может быть я совсем не прав), что именно одна из подобных строк и вызывает подобное сообщение...
если идти пошагово (встав на эту строку и нажав кнопку F11) я естественно попадаю в DataSet.Disinger.vb (код згенерированный конструктором), так вот при выполнении фила на ТейблАдаптере мне ведь не поможет:
Код

lc_Count = Me.CheloveckTableAdapter.Fill(Me.DS_SocDefence.Cheloveck)
Application.DoEvents()

или поможет?


Автор: ivashkanet 1.2.2007, 17:21
Цитата(HellMasterHaiL @  1.2.2007,  16:19 Найти цитируемый пост)
или поможет?

Попробуй  smile 

А вообще попробуй брать из БД только необходимую информацию

Автор: HellMasterHaiL 1.2.2007, 17:52
Цитата(ivashkanet @ 1.2.2007,  17:21)
Попробуй   

А вообще попробуй брать из БД только необходимую информацию

спасибо, вроде помогло, осталось проверить при большой загрузке компа

в том то и весь кирпич, что беру необходимый минимум, но этот минимум большого размера ( 16 секундный запрос на прямую с сервера выдает 356 записей по 86 полей, учавствует около 12-15 таблиц)...
вот так вот( 
а выковыривать все адаптеры - замучаюсь)

Автор: ivashkanet 1.2.2007, 18:15
Цитата(HellMasterHaiL @  1.2.2007,  16:52 Найти цитируемый пост)
в том то и весь кирпич, что беру необходимый минимум, но этот минимум большого размера ( 16 секундный запрос на прямую с сервера выдает 356 записей по 86 полей, учавствует около 12-15 таблиц)...вот так вот( а выковыривать все адаптеры - замучаюсь)

Тогда можно заполнение датасета с помощью Me.CheloveckTableAdapter.Fill(Me.DS_SocDefence.Cheloveck) 
выделить в отдельный поток. Но, судя по всему, это для тебя приличный пласт знаний.

Если интересно --- пиши, покумекаем smile

Добавлено @ 18:16 
Цитата(ivashkanet @  1.2.2007,  17:15 Найти цитируемый пост)
выделить в отдельный поток.

А приложение немножко "подвесить", показав только прогрессбар smile

Автор: HellMasterHaiL 1.2.2007, 18:31
ivashkanet, интересно, еще как интересно, рассказывай давай))) , если конечно не в падлу, или дай линку на литру (лучше русскую \=-) )

Автор: ivashkanet 1.2.2007, 18:54
http://www.bytemag.ru/?ID=600871 пока что нашел. Прочитай, потом будем капать дальше.
Что будет непонятно --- спрашивай в отдельной теме smile

А вообще http://www.google.com/search?q=%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0%D0%BC%D0%B8+VB+.Net&hl=ru&client=opera&rls=ru&hs=gvd&start=10&sa=N

Автор: HellMasterHaiL 1.2.2007, 19:08
премного благодарен

Автор: Bladerender 10.9.2010, 15:50
Цитата(ivashkanet @ 1.2.2007,  18:54)
http://www.bytemag.ru/?ID=600871 пока что нашел. Прочитай, потом будем капать дальше.
Что будет непонятно --- спрашивай в отдельной теме ;-)

А вообще http://www.google.com/search?q=%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0%D0%BC%D0%B8+VB+.Net&hl=ru&client=opera&rls=ru&hs=gvd&start=10&sa=N

off: а я вот в гугле эту тему нагуглил, так что перед тем как в гугл идти, нуна подумать, не приведет ли он тебя в твою же тему. 

Автор: Pilger 11.9.2010, 14:47
И к чему это? Ты на дату последнего сообщения смотрел?

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