【问题标题】:The CLR has been unable to transition from COM context 0x22c4f60 to COM context 0x22c51b0 for 60 secondsCLR 在 60 秒内无法从 COM 上下文 0x22c4f60 转换到 COM 上下文 0x22c51b0
【发布时间】:2013-10-25 09:23:31
【问题描述】:

我正在开发一个调用 Web 服务的应用程序,该服务从数据库中删除信息(该 Web 服务是由第三方供应商开发的)。在第一次运行时,大约有 100,000 条记录被删除。

我已经对该例程进行了几次测试,这偶尔会出现在 Visual Studio 中:

“CLR 在 60 秒内无法从 COM 上下文 0x22c4f60 转换到 COM 上下文 0x22c51b0。 拥有目标上下文/单元的线程很可能要么进行非泵送等待,要么处理非常长时间运行的操作而不泵送 Windows 消息。 这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移不断累积。 为避免此问题,所有单线程单元 (STA) 线程都应使用泵送等待原语(例如 CoWaitForMultipleHandles)并在长时间运行的操作期间定期泵送消息。”

我假设 Web 服务需要 60 多秒才能将控制权传回给 .NET Forms 应用程序。请参阅消息中的以下引用:“为避免此问题,所有单线程单元 (STA) 线程应使用泵送等待原语(例如 CoWaitForMultipleHandles)并在长时间运行的操作期间定期泵送消息”。由于这是一个 Windows 窗体应用程序,这是否意味着我不需要为此做任何事情?

【问题讨论】:

  • 删除的代码是否在 UI 线程上运行?如果是这样,请尝试将其移至后台线程。
  • 它在主线程上运行。这就是你所说的UI线程吗?这个警告是我应该关注的吗?比
  • 除非您以某种方式启动了另一个线程,否则您只有一个线程,它是控制 UI 的线程。如果您不关心 UI 的响应性,请不要担心,但大多数用户不喜欢它。如果您搜索 MSDN 文档,您可以关闭此警告。
  • dbasnett,再次感谢。这是一个调用表单的 Windows 计划任务,因此用户不使用此应用程序。因此我可以忽略它。你知道解释这个错误的任何链接吗(我已经用谷歌搜索了)。请发布答案,以便我可以给予一些信任。

标签: vb.net clr asmx


【解决方案1】:

有时,由于服务器名称错误,也可能会出现此问题,例如,如果您包含 SERVER/SQLEXPRESS 而不是 SERVER\SQLEXPRESS,那么也会显示此错误,这是我的情况。

【讨论】:

    【解决方案2】:

    检查并确定您使用的阅读器是否未包含 try/catch。您应该努力尝试并比这更好地解决您的解决方案问题。 try/catch 会导致超时,尤其是在 while 循环中。

    【讨论】:

      猜你喜欢
      • 2011-02-14
      • 1970-01-01
      • 2011-06-19
      • 2017-04-03
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多