本帖最后由 Win32FanEx 于 2010-06-22 15:34:31 编辑

解决方案 »

  1.   

    设置个定时器,到时间检查ReadState,如果不是Complete。就停止打开。不需要弄这么复杂。复杂的设计要谨慎。很少有既复杂又强壮的设计。
      

  2.   

    使用多线程
    要执行的部分写成函数   然后使用事件委托的模式 
    while(true){//事件调用}
      

  3.   

    通过使用Timer等方法设置延迟间隔,不使用Sleep方法停止当前线程的执行以求达到延迟目的
    WebBrowser控件也处于当前线程内,Sleep会同时暂停WebBrowser控件的运作。
      

  4.   

    楼上朋友方法比较简单,但这样可能会产生较为严重的延迟。特别是对于一些大型网页或网络不太好情况下。不过要想暂停webbrowser的navigate真的是很困难,webbrowser是如何navigate的不清楚,只知道它是异步的,它的线程在哪?不清楚,更别提暂停它了。。
      

  5.   

    "楼上朋友"是指wuyazhe,写贴子期间wuyq11又回了贴。
    到底用不用Sleep?我的目的就是要暂停webbrowser的navigate。请wuyq11仔细看我开头贴子,能不能给一个针对、具体的解决办法,谢谢!
      

  6.   

    其实很简单。我刚试了一下。效果不错。避免假死应该可以的。webBrowser1.Navigate(@"http://www.csdn.net");
    System.Threading.Timer t = new System.Threading.Timer(
        m => this.Invoke((Action)delegate
            {
                if (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
                {
                    webBrowser1.Stop();//终止掉
                }
            }), null, 30000, System.Threading.Timeout.Infinite);//30秒检测
      

  7.   

    改进了一下。这样比较合理了。原理都注释进去了。private void button1_Click(object sender, EventArgs e)
    {
        bool live = true;
        webBrowser1.Navigate(@"http://www.csdn.net");
        webBrowser1.ProgressChanged += delegate { live = true; };
        System.Threading.Timer t = new System.Threading.Timer(
            m => this.Invoke((Action)delegate
            {
                //还没加载完,并且连续30秒没有进度增加了。
                if (!live && webBrowser1.ReadyState != WebBrowserReadyState.Complete) webBrowser1.Stop();//终止掉
                live = false;//检查过就设置为false,如果下一次进入循环,还是false表明进度没增加,可以考虑结束打开了
            }), null, 0, 30000);//30秒检测,我们不检查是否结束了。而是判断是否仍然在尝试打开,这样如果网速慢就不至于错判
    }
      

  8.   


    简值不敢相信自己眼睛!楼上朋友你用的是56K moderm吗?就算是比较大的页面比如yahoo sohu首页,加载完毕也就5秒-10秒(现在宽带已普及),30秒-5分钟....我想等待时间应控制在3秒以内,这样用户才不会待的心烦。
      

  9.   

    非常感谢楼上朋友测试代码,现在考虑对之进行改变,就是不等complete,等到50%时就开始加载。这样能加快响应速度。当然最好是能找到暂停webbrowser navigate的方法。
      

  10.   

    楼主我不知道你是否解决了,我今天遇到和你一样的问题,我是如此解决的:1、定义一个bool变量,来标识我的一个任务是否完成
    2、在 axWebBrowser组件中的 BeforeNavigate方法中,判断这个变量,如果没完成,那我设置:   Cancel = true;
       return;   从而达到自己的目的,希望对你有帮助
      

  11.   

    一年多过去了感谢叮当最后的回贴一年来,我通过页面分离方法制作了多进程web浏览器,防假死防崩溃。
    但多进程技术实现复杂,C#下更为低效。于是又改回了单进程。于是再次翻开了这个贴子,并采用了wuyazhe的方法。实在找不到其它防假死方法了。我想对于网页加载缓慢情况这种方法或许有些用处。如果网页真的卡死,webBrowser1.Stop可能根本就得不到执行。再次感谢当初回贴朋友!