Я пишу приложение WinForms на С#.
В какой-то момент приложения я создаю новый поток STA (создаем поток, затем SetApartmentState
), который создает новую форму, а затем показывает ее с простым старым Show()
. Сама форма содержит только прикрепленный DataGrid
, чей DataSource
указывает на DataTable
, извлеченный из недавно открытого SqlConnection
. Все данные и объекты пользовательского интерфейса создаются в одном потоке.
Когда я выполняю этот код, я получаю исключение LoaderLock
со следующим (полезным) текстом:
Попытка управляемого выполнения внутри ОС Замок погрузчика. Не пытайтесь запустить управляемый код внутри DllMain или изображения функция инициализации, так как может привести к зависанию приложения.
Я не делаю такой вещи, по крайней мере, не намеренно! Трассировка стека имеет только неуправляемый код во главе, и я не могу отлаживать это с помощью С# Express 2008.
Оглядываясь на Интернет, люди обычно просто отключают это исключение в VisualStudio. Является ли это еще одним примером того, что Microsoft является падактирующим, или я должен тратить время на выяснение того, что происходит?
Обновление Ошибка, по-видимому, вызвана тем, что быстро открыли формы несколько (каждая с сеткой данных и т.д.). Если я переключу Show()
на ShowDialog()
и просмотрю формы по одному, ошибка исчезнет.
Я видел это раньше, когда использовал P/Invoke с DLL, которая не была построена совершенно правильно. Я думаю, мы убедились, что это не опасно в нашем конкретном случае и потребует больше усилий для устранения, чем для отключения предупреждения.
У вас есть собственный код в вашем приложении?
Я испытал это при работе с Managed DirectX. Мое решение состояло в том, чтобы отключить помощник отладчика Locker Lock, хотя это может и не быть лучшим решением для каждого случая. Это не было проблемой с производственным кодом.
У меня была эта точная проблема до сих пор с многопоточными формами С#. Это было некоторое время назад, поэтому я изо всех сил пытаюсь запомнить детали, но я помню, что проблема связана с выполнением операций над формами или элементами управления потоком, который их не имеет. вызывая Show() из неправильного потока. Если вы передадите сообщение в поток прав собственности и получите его для обработки таких операций, это может решить вашу проблему.