在多个线程中使用WebBrowser时发生访问冲突

时间:2017-02-16 20:17:02

标签: c# multithreading exception webbrowser-control access-violation

我在多个线程中使用WebBrowser,但是,在一些执行后(从50到10000+)我得到了访问冲突异常。

代码的相关部分:

启动线程:

    var thread = new Thread(() =>
    {
        ProcessingThread();
    });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();

处理线程:

void ProcessingThread()
{
    WebBrowser webBrowser = new WebBrowser();
    webBrowser.ScriptErrorsSuppressed = true;
    while (!Shutdown)
    {
        string htmlstring = GetHTMLString();
        webBrowser.DocumentText = htmlstring;
        webBrowser.Document.OpenNew(true);
        webBrowser.Document.Write(htmlstring);
        webBrowser.Refresh();
        HtmlDocument doc = webBrowser.Document;

        //Do Work
    }
}

通常有2到8个此类线程同时运行。

我经常在

上获得访问冲突
  

webBrowser.Document.OpenNew(真);

我已经阅读了许多类似的问题,但找不到我的问题的解决方案。

我想弄清楚异常的原因和解决方案。

截至目前,我正在使用WinForms和Visual Studio 2015 Update 3。

异常字符串:

  

抛出异常:' System.AccessViolationException'在   System.Windows.Forms.dll中

我注意到的另一件事是我使用的更高版本的.NET使用上述线程在抛出异常之前执行的次数越少。

例如,我尝试运行它十次,它在.NET 4.5上执行1000到10000(我所做的所有测试的绝对最大值,通常最大值大约是5000次),从70到1500次。 NET 4.6.1。

我试过了:

  • 使用本机代码调试选项,但它仍然指的是相同的 线。
  • 更改平台目标,但没有任何明显的结果。目前,它是x86。
  • 打开和关闭代码优化。
  • 在没有调试器的情况下运行。
  • 将目标框架更改为无结果。目前,它是.NET 4.5.2。
  • 在另一台计算机上运行/调试应用程序。

我也了解WebRequest,WebClient以及关于HMTLAgilityPack的其他内容,但我正在使用WebBrowser来支持它。

1 个答案:

答案 0 :(得分:0)

在我的情况下,可通过的解决方案是使用方法上的System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions属性来处理访问冲突异常。

经过一些测试后,我发现只是捕获异常并重试相同的方法,异常被抛出,因为执行继续正常,没有任何不可预见的异常。

我已经测试了更多的100000次执行,所以我认为这是一次传球。

我正在写这个,因为它在这种情况下可以作为我的解决方案,并且可能对其他人有用,但是,我并没有将其标记为已回答,因为我仍然不明白为什么会出现异常,如果有的话处理或防止这种情况的更好方法。