【发布时间】:2010-10-29 22:37:18
【问题描述】:
我正在用 C# 编写一个 WinForms 应用程序。
在应用程序的某个时刻,我生成了一个新的 STA 线程(创建线程,然后是 SetApartmentState),它创建一个新表单,然后用普通的旧 Show() 显示它。表单本身只包含一个停靠的DataGrid,其DataSource 指向从新打开的SqlConnection 检索到的DataTable。所有数据和 UI 对象都在同一个线程上创建。
当我执行该代码时,我得到一个 LoaderLock 异常,并带有以下(有用的)文本:
尝试在操作系统内部进行托管执行 装载机锁。不要试图跑 DllMain 或图像中的托管代码 初始化函数,因为这样做 可能会导致应用程序挂起。
我没有这样做,至少不是故意的!堆栈跟踪的头部只有非托管代码,我无法使用 C# Express 2008 对其进行调试。
环顾互联网,人们通常只是在 VisualStudio 中禁用该异常。这是微软自欺欺人的又一个例子,还是我真的应该花时间弄清楚发生了什么?
更新该错误似乎是由于快速打开多个表单(每个表单都有数据网格等)引起的。如果我将Show() 切换到ShowDialog() 并一次查看一个表单,那么错误就会消失。
【问题讨论】:
标签: c# .net multithreading