LoaderLock обнаружен в многопоточном приложении C #

2

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

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

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

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

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

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

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

Теги:
multithreading

3 ответа

3

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

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

  • 0
    У нас также было это предупреждение. Это вызывало редкие зависания в отладчике - но никаких других проблем, которые мы видели.
  • 0
    Нет нативного кода вообще. Надеюсь, как только я вернусь в офис, я смогу отследить неуправляемый стек вызовов.
Показать ещё 1 комментарий
2

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

1

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

  • 0
    Я очень осторожен с многопоточностью. В этом случае поток вообще не связывается с другими потоками, поэтому я вполне уверен, что здесь не проблема межпотокового взаимодействия.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню