LoaderLock обнаружен в многопоточном приложении C # - PullRequest
2 голосов
/ 29 мая 2009

Я пишу приложение WinForms на C #.

В какой-то момент в приложении я создал новый поток STA (создайте поток, затем SetApartmentState), который создает новую форму, а затем показывает ее с простым старым Show(). Сама форма содержит только закрепленный DataGrid, чей DataSource указывает на DataTable, полученный из недавно открытого SqlConnection. Все данные и объекты пользовательского интерфейса создаются в одном потоке.

Когда я выполняю этот код, я получаю исключение LoaderLock со следующим (полезным) текстом:

Попытка управляемого выполнения внутри ОС Блокировка погрузчика. Не пытайтесь бежать управляемый код внутри DllMain или изображения функция инициализации, так как это делает может привести к зависанию приложения.

Я не делаю таких вещей, по крайней мере, намеренно! Трассировка стека имеет только неуправляемый код во главе, и я не могу отладить его в C # Express 2008.

Просматривая интернет, люди обычно просто отключают это исключение в VisualStudio. Является ли это еще одним случаем того, что Microsoft является падантиком, или я действительно должен потратить время на выяснение того, что происходит?

Обновление Ошибка, по-видимому, вызвана быстрым открытием нескольких форм (каждая с сеткой данных и т. Д.). Если я переключу Show() на ShowDialog() и посмотрю формы по одному, ошибка исчезнет.

Ответы [ 3 ]

3 голосов
/ 29 мая 2009

Я видел это раньше, когда использовал P / Invoke с DLL, которая была построена неправильно. Я думаю, мы убедились, что это не опасно в нашем конкретном случае и потребует больше усилий для исправления, чем для отключения предупреждения.

У вас есть собственный код в вашем приложении?

2 голосов
/ 29 мая 2009

Я испытал это при работе с Managed DirectX. Моим решением было отключить помощник по отладке Loader Lock, хотя это может быть не лучшим решением для каждого случая. Это, конечно, не было проблемой с рабочим кодом.

1 голос
/ 29 мая 2009

У меня раньше была эта проблема с многопоточными формами C #. Это было некоторое время назад, поэтому я изо всех сил стараюсь запомнить детали, но я вспоминаю, что проблема была связана с выполнением операций над формами или элементами управления потоком, которому они не принадлежат - например, вызов Show () из неправильного потока. Если вы передадите сообщение потоку-владельцу и получите его для обработки таких операций, это может решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...