我做了一个通过WebBrowser抓取数据的程序,当然数据包括图片、声音和视频以及网页截图,所以必须使用webbrowser,但程序运行一段时间后会出现下面的异常:
检测到 ContextSwitchDeadlock
Message: CLR 无法从 COM 上下文 0x3b02f0 转换为 COM 上下文 0x3b0ad8,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作。这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积。要避免此问题,所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。
这个问题我看了好多是有一个语句块有问题,如下:
我最终把线程用类包装了下,与UI分开了,并且做了以下改正。
...
var t = new Thread();
t.Start();
while(t.IsAlive)
Application.DoEvents(); 这句会导致死锁,线程会在一段时间后自己死掉,没有结束,但是不动了,原因不知。把这句换成Thread.Sleep(100)就没有再出现这个问题了,但内存现在有问题,已经新开帖了。
之前遇到过,线程执行的时间太长了.当时是进行了优化,缩短了执行时间.
将线程任务从窗体提出来用类包装了一层,与控件交互都做了处理,现在主界面不会死了,但线程运行一段时间后莫名就死那儿了,主窗体可以动,所有线程状态都是在运行,但没有数据输出了,都不知道死在哪里了,怎么办呢?
@沧海一杰: 关键问题是线程间根本没有要访问的公共对象,根本不需要同步呀?怎么会死锁呢?