繁体   English   中英

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

[英]Access Violation when using WebBrowser in multiple threads

我在多个线程中使用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.Windows.Forms.dll中的“ System.AccessViolationException”

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

例如,从我尝试运行它的十次开始,它在.NET 4.5上执行了1000到10000次(我进行的所有测试的绝对最大值,通常最大值约为5000),而在.NET 4.6上执行了70到1500次。 1。

我努力了:

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

我也了解WebRequest,WebClient和有关HMTLAgilityPack的其他信息,但是我正在使用WebBrowser为其Javascript支持。

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

经过一些测试,我发现仅捕获异常并重试相同的方法即可将异常抛出,因为执行可以继续正常进行而没有任何不可预见的异常。

我已经在100000次执行中对其进行了测试,因此我认为它是通过的。

我正在编写此文档,因为它在这种情况下可以为我提供解决方案,并且可能对其他人有用,但是,我未将其标记为已回答,因为我仍然不理解为什么会出现异常以及是否有更好的方法处理或预防这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM