【发布时间】:2011-02-14 10:19:39
【问题描述】:
我在以前可以工作的代码上收到此错误。我没有改代码。
这是完整的错误:
CLR 在 60 秒内无法从 COM 上下文 0x3322d98 转换到 COM 上下文 0x3322f08。拥有目标上下文/单元的线程很可能要么进行非泵送等待,要么处理非常长时间运行的操作而不泵送 Windows 消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移不断累积。为避免此问题,所有单线程单元 (STA) 线程都应使用泵送等待原语(例如 CoWaitForMultipleHandles)并在长时间运行的操作期间定期泵送消息。
这是导致它的代码:
var openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
openFileDialog1.DefaultExt = "mdb";
openFileDialog1.Filter = "Management Database (manage.mdb)|manage.mdb";
//Stalls indefinitely on the following line, then gives the CLR error
//one minute later. The dialog never opens.
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
....
}
是的,我确定对话框没有在后台打开,不,我没有任何明确的 COM 代码或非托管编组或多线程。
我不知道为什么 OpenFileDialog 无法打开 - 有什么想法吗?
【问题讨论】:
-
我从未见过没有星号的过滤器。试试
"Management Database (*.mdb)|*.mdb"我不知道这是否会混淆框架中的某些内容。 -
@Aaron:正如我所说,它就在昨天起作用。我只是在寻找具有该特定名称的特定文件
-
这不是错误,而是调试器警告。由 ContextSwitchDeadlock 托管调试助手生成,旨在警告由于 COM 封送处理可能导致的死锁。 OpenFileDialog 使用了大量的 COM。你只有在调试你的应用程序时才会得到它。网络超时时间很长,您必须等待一段时间才能引发真正的异常。
-
这个异常怎么不是错误?在我的情况下,在长时间运行的操作中使用相同的文本引发异常并且永远不会完成操作。