头疼死了,webBrowser到底怎么用?
我用webBrowser做了一个网页批量截图工具,截完图后自动截下一个图。虽然不是多线程,但多打开几个窗口同时工作还是很不错的。
最大的问题是在运行一段时间候就会报内存错误,重新打开又正常了。在网上找了很多资料说没有释放资源造成的。后来想了一下,不停的在webBrowser里打开数百个网页,我想就是IE也会出问题,可是怎么才可以释放资源?
使用
System.Runtime.InteropServices.Marshal.ReleaseComObject(webBrowser);
好象没有效果,问题还会出来
使用
GC.Collect();
GC.WaitForPendingFinalizers();
还是没有效果
使用
do
{
refsLeft = System.Runtime.InteropServices.Marshal.ReleaseComObject(webBrowser.ActiveXInstance);
} while (refsLeft > 0);
俣用这个更可怕,连重新创建都不行了。
最后使用
webBrowser.Dispose();
用它释放后截下一个图的时候再重新创建webBrowser对象,重新加入事件。运行扣前几张正常,但时间不长就弹出无数的空白网页。不知是什么原因。
还有人说用线程创建webBrowser,当线程结彭束后,资源就释放了。
创建线程又要指定ApartmentState.STA,
程序正常 运行,但是运行到webBrowser(xcv).Navigate就结束了跟本不会运行DocumentCompleted事析里的程序。由与一直没有成功的在线程里完成工作,所以会不会出现内存问题还是个未知数。
声明一下我是个菜鸟,好多基本知识还不是很了解,请大家帮着看看,用什么方法可以正常做到批量截图。
------最佳解决方案--------------------最大的问题是在运行一段时间候就会报内存错误,重新打开又正常了。在网上找了很多资料说没有释放资源造成的???
详细的错误信息是什么,完整得贴上来看看.
"没有释放资源造成", 你怎么确定的是webBrowser没有释放资源,而不是其它地方的问题?
如果可以,把代码也贴上来看看
------其他解决方案--------------------像IE一样,打开一个网页后,然后关闭IE,再打开IE,再打网页,这样应该进行100次也不会出错,类似的,你可以新建一个项目,用来打开网页并执行你的截图操作,完成写一个注册表之类的共享变量表示完成,另一个项目检测到这个变量是完成后,关闭前面那个项目,再打开那个项目重新执行,网页地址之类的都可以通过内存映像或注册表传递,当然,这是土方法,没有去找你内存报错问题的根源。
------其他解决方案--------------------我是一个菜鸟,帮不上忙了。
------其他解决方案--------------------http://topic.csdn.net/u/20090702/11/845f5ac5-48f2-463a-8271-47c5eeb33cab.html
------其他解决方案--------------------WebBrower.DrawToBitmap(bmp);
http://topic.csdn.net/u/20070405/12/743C100A-0798-4D0C-BA24-2BF1C62BF821.html
------其他解决方案--------------------路过。。。。。。。。。
------其他解决方案--------------------你try{}catch{}一下,当它抛出异常时,你重新启动一下它。
------其他解决方案--------------------动态的webbrowser, 用完就destroy掉。
------其他解决方案--------------------帮顶一下
------其他解决方案--------------------up回复内容太短了!
------其他解决方案--------------------换多进程程序吧
------其他解决方案--------------------路过学习中..........
------其他解决方案--------------------哪果多线程没问题的话,还是喜欢在多线程里完成。
------其他解决方案--------------------上面说的罗嗦了,其实就两个问题
第一在webBrowser频繁加载网页如何不出现内存错误。
第二webBrowser可以在线程里创建吗?线程里的事建如何工作?多线程同时截图会出现内存问题吗?
------其他解决方案--------------------