【发布时间】: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 计划任务,因此用户不使用此应用程序。因此我可以忽略它。你知道解释这个错误的任何链接吗(我已经用谷歌搜索了)。请发布答案,以便我可以给予一些信任。