首先由于我缺乏技术知识和可能的误解而道歉,我是C#的新手。

我已经接管了一个项目,该项目将刮掉许多网页并将其另存为.png文件。

private void CaptureWebPage(string URL, string filePath, ImageFormat format)
{
    System.Windows.Forms.WebBrowser web = new System.Windows.Forms.WebBrowser();
    web.ScrollBarsEnabled = false;
    web.ScriptErrorsSuppressed = true;
    web.Navigate(URL);

    while (web.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
        System.Windows.Forms.Application.DoEvents();
    System.Threading.Thread.Sleep(5000);

    int width = web.Document.Body.ScrollRectangle.Width;
    width += width / 10;
    width = width <= 300 ? 600 : width;


    int height = web.Document.Body.ScrollRectangle.Height;
    height += height / 10;

    web.Width = width;
    web.Height = height;

    _bmp = new System.Drawing.Bitmap(width, height);


    web.DrawToBitmap(_bmp, new System.Drawing.Rectangle(0, 0, width, height));
    _bmp.Save(filePath, format);

    _bmp.Dispose();

}

但是,某些页面(仅一小部分)导致进程挂起。它不是一直都在,但是经常。我发现问题似乎出在代码的以下部分:
while (web.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
    System.Windows.Forms.Application.DoEvents();

好像web.ReadyState停留在“交互”状态,并且从不进行“完成”操作,因此它只会不断循环播放。

如果web.ReadyState ='Interactive'在一定时间内,是否可以放入导致该页面重新启动过程的代码,如果是,语法是什么?

最佳答案

Ive用以下代码替换了现有的有问题的代码(可在thebotnet.com上找到):

while (web.IsBusy)
    System.Windows.Forms.Application.DoEvents();
for (int i = 0; i < 500; i++)
    if (web.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
   {
       System.Windows.Forms.Application.DoEvents();
       System.Threading.Thread.Sleep(10);
   }
   else
       break;
System.Windows.Forms.Application.DoEvents();

我已经对其进行了几次测试,所有页面似乎都被刮掉了。为了以防万一,我将继续进行测试,但是如果您有任何可能引起问题的信息,请告诉我,因为我可能自己也找不到。

关于c# - Web.ReadyState未达到 'complete'阶段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17408713/

10-10 08:00