Browser.ReadyState上的致命执行错误

可能重复:
.NET“致命执行引擎错误”故障排除

我的代码抛出致命执行错误。 确切的错误是这样的:

运行时遇到了致命错误。 错误的地址位于线程0x2044处的0xed40646c处。 错误代码是0xc0000005。 此错误可能是CLR中的错误,也可能是用户代码的不安全或不可validation部分中的错误。 此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会破坏堆栈。

据我所知,我没有使用不安全的用户代码。

导致问题的代码是这样的:

WebClient client = new WebClient(); string pageHtml = client.DownloadString(url); browser.ScriptErrorsSuppressed = true; browser.DocumentText = pageHtml; do { Application.DoEvents(); } while (browser.ReadyState != WebBrowserReadyState.Complete); //CRASH OCCURS HERE 

现在这里是踢球者。 此代码在循环上运行。 它经常发生这种错误。 有时它在第1000次运行。 上次是第5545次。 它似乎非常随机。

我该如何解决这个问题? 或者我如何获得更多信息来解决它?

我的解决方案是基于如何等待WebBrowser在VB.NET中完全加载?

您需要做的是将bool _pageReady变量添加到Completed事件。

 void web_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { var urlCurrent = e.Url.ToString(); var browser = (WebBrowser)sender; if (!(urlCurrent.StartsWith("http://") || urlCurrent.StartsWith("https://"))) { // in AJAX } if (e.Url.AbsolutePath != browser.Url.AbsolutePath) { // IFRAME } else { // DOCUMENT IS LOADED 100% Debug.WriteLine("DocumentCompleted " + DateTime.Now.TimeOfDay.ToString()); _pageReady = true; // Here it goes!!!! :) try { mshtml.IHTMLDocument2 docs2 = (mshtml.IHTMLDocument2)web.Document.DomDocument; mshtml.IHTMLDocument3 docs3 = (mshtml.IHTMLDocument3)web.Document.DomDocument; mshtml.IHTMLElement2 body2 = (mshtml.IHTMLElement2)docs2.body; mshtml.IHTMLElement2 root2 = (mshtml.IHTMLElement2)docs3.documentElement; // Determine dimensions for the image; we could add minWidth here // to ensure that we get closer to the minimal width (the width // computed might be a few pixels less than what we want). int width = Math.Max(body2.scrollWidth, root2.scrollWidth); int height = Math.Max(root2.scrollHeight, body2.scrollHeight); //get the size of the document's body Rectangle docRectangle = new Rectangle(0, 0, width, height); web.Width = docRectangle.Width; web.Height = docRectangle.Height; //if the imgsize is null, the size of the image will //be the same as the size of webbrowser object //otherwise set the image size to imgsize Rectangle imgRectangle; if (imgsize == null) imgRectangle = docRectangle; else imgRectangle = new System.Drawing.Rectangle() { Location = new System.Drawing.Point(0, 0), Size = imgsize.Value }; //create a bitmap object __Bitmap = new Bitmap(imgRectangle.Width, imgRectangle.Height); //Rectangle resolution = Screen.PrimaryScreen.Bounds; //__Bitmap.SetResolution(resolution.Width, resolution.Height); //get the viewobject of the WebBrowser IViewObject ivo = web.Document.DomDocument as IViewObject; using (Graphics g = Graphics.FromImage(__Bitmap)) { //get the handle to the device context and draw IntPtr hdc = g.GetHdc(); ivo.Draw(1, -1, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, hdc, ref imgRectangle, ref docRectangle, IntPtr.Zero, 0); g.ReleaseHdc(hdc); } //var randomPart = System.IO.Path.GetRandomFileName(); //__Bitmap.Save(@"D:\t" + randomPart + ".png"); if (CropRectangle != null) { if (CropRectangle.Width > 0 && CropRectangle.Height > 0) { Bitmap bmpCrop = __Bitmap.Clone(CropRectangle, __Bitmap.PixelFormat); __Bitmap = bmpCrop; } } //__Bitmap.Save(@"D:\cropped" + randomPart + ".png"); bitmapPointer = __Bitmap.GetHbitmap(); } catch { //System.Diagnostics.Process.GetCurrentProcess().Kill(); } } } 

并做一些类似的事情

 public void HtmlCapture2() { try { if (web == null) web = InitWebBrowser(); web.Navigate(_navigateURL); try { while (_pageReady == false) // YEAH!!!!!! IT IS WORKING!!!! { System.Windows.Forms.Application.DoEvents(); } //Thread.Sleep(WaitForWebsite); --- It works but.... //while (web.ReadyState != WebBrowserReadyState.Complete) --- it gives an ERROR // System.Windows.Forms.Application.DoEvents(); } catch (Exception) { } } catch (Exception) { } }