我用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事析里的程序。由与一直没有成功的在线程里完成工作,所以会不会出现内存问题还是个未知数。声明一下我是个菜鸟,好多基本知识还不是很了解,请大家帮着看看,用什么方法可以正常做到批量截图。

解决方案 »

  1.   

    上面说的罗嗦了,其实就两个问题
    第一在webBrowser频繁加载网页如何不出现内存错误。第二webBrowser可以在线程里创建吗?线程里的事建如何工作?多线程同时截图会出现内存问题吗?
      

  2.   

    http://topic.csdn.net/u/20090702/11/845f5ac5-48f2-463a-8271-47c5eeb33cab.html
      

  3.   

    WebBrower.DrawToBitmap(bmp);http://topic.csdn.net/u/20070405/12/743C100A-0798-4D0C-BA24-2BF1C62BF821.html
      

  4.   

    你try{}catch{}一下,当它抛出异常时,你重新启动一下它。
      

  5.   

    最大的问题是在运行一段时间候就会报内存错误,重新打开又正常了。在网上找了很多资料说没有释放资源造成的???详细的错误信息是什么,完整得贴上来看看.
    "没有释放资源造成", 你怎么确定的是webBrowser没有释放资源,而不是其它地方的问题?
    如果可以,把代码也贴上来看看
      

  6.   

    动态的webbrowser, 用完就destroy掉。
      

  7.   

    像IE一样,打开一个网页后,然后关闭IE,再打开IE,再打网页,这样应该进行100次也不会出错,类似的,你可以新建一个项目,用来打开网页并执行你的截图操作,完成写一个注册表之类的共享变量表示完成,另一个项目检测到这个变量是完成后,关闭前面那个项目,再打开那个项目重新执行,网页地址之类的都可以通过内存映像或注册表传递,当然,这是土方法,没有去找你内存报错问题的根源。
      

  8.   

    11楼说的destroy 在net 里找不到,我用
                    webBrowser.Dispose();
                    webBrowser = null;
    但还是会出现同样的问题错误信息提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”12楼说的方法,应该没问题,不过我不会弄啊,有现成的代码可以参考吗?
      

  9.   

    哎...我的更离谱。模拟按钮点击提交以后,webbrowser还是显示登录页面。