【问题标题】:LoaderLock was detected in multithreaded C# application在多线程 C# 应用程序中检测到 LoaderLock
【发布时间】: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


    【解决方案1】:

    我在使用托管 DirectX 时遇到过这种情况。我的解决方案是禁用 Loader Lock 调试助手,尽管这可能不是每个情况的最佳解决方案。这当然不是生产代码的问题。

    【讨论】:

      【解决方案2】:

      我以前在使用多线程 C# 表单时遇到过这个确切的问题。有一段时间了,所以我很难记住细节,但我记得这个问题与不拥有它们的线程对表单或控件执行操作有关——例如从错误的线程调用 Show()。如果您将消息传递给拥有线程并让它处理此类操作,那么这可能会解决您的问题。

      【讨论】:

      • 我对多线程非常小心。在这种情况下,线程根本不与其他线程通信,所以我非常确信跨线程通信不是这里的问题。
      【解决方案3】:

      我以前在将 P/Invoke 与构建不完全正确的 DLL 一起使用时看到过这种情况。我认为我们确定在我们的特定情况下它并不危险,并且会花费更多的精力来修复而不是禁用警告。

      您的应用中是否有任何本机代码?

      【讨论】:

      • 我们也收到了这个警告。它在调试器中造成了罕见的挂起 - 但我们没有看到其他问题。
      • 根本没有本机代码。希望一旦我回到办公室,我就能够追踪非托管调用堆栈。
      • 这里只是将信息添加到旧的问答中。其他人也有同样的问题here。我在使用 VS2010SP1 调试 Excel 插件时看到了这一点......谈到“一个构建得不太正确的 DLL”。 :) 基于一般智慧,我将标记 VS 以忽略这些错误,至少在我从事这个项目时是这样。感谢 OP 和其他人在这里提供信息。
      猜你喜欢
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      相关资源
      最近更新 更多