我正在用C#编写WinForms应用程序。
在应用程序的某一点上,我产生了一个新的STA线程(创建线程,然后是SetApartmentState
),它创建了一个新表单,然后用普通的Show()
显示它。表单本身仅包含一个停靠的DataGrid
,其DataSource
指向从新打开的DataTable
中检索到的SqlConnection
。所有数据和UI对象都在同一个线程上创建。
当我执行该代码时,我得到一个LoaderLock
异常,其中包含以下(有用)文本:
在OS中尝试托管执行 装载机锁。不要试图跑 DllMain或图像中的托管代码 初始化函数,因为这样做 可以导致应用程序挂起。
我没有这样做,至少不是故意的!堆栈跟踪只有非托管代码,我无法使用C#Express 2008进行调试。
环顾互联网,人们通常只是在VisualStudio中禁用该异常。这是否是微软的另一个案例,或者我是否应该花时间搞清楚发生了什么?
更新错误似乎是由于快速打开多个表单(每个表单都有数据网格等)引起的。如果我将Show()
切换为ShowDialog()
并一次查看一个表单,则错误就会消失。
答案 0 :(得分:3)
我之前在使用P / Invoke时使用的DLL看起来并不是很正确。我认为我们确定它在我们的特定情况下并不危险,并且需要更多的努力来解决而不是禁用警告。
您的应用中是否有任何原生代码?
答案 1 :(得分:2)
我在使用Managed DirectX时遇到过这种情况。我的解决方案是禁用Loader Lock调试助手,尽管这可能不是每个案例的最佳解决方案。它当然不是生产代码的问题。
答案 2 :(得分:1)
我之前使用多线程C#表单已经遇到了这个问题。这是一段时间,所以我很难记住细节,但我记得这个问题与通过不拥有它们的线程对表单或控件执行操作有关 - 例如。从错误的线程调用Show()。如果您将消息传递给拥有的线程并让它来处理此类操作,那么这可能会解决您的问题。