gpt4 book ai didi

c# - 在多线程中使用 WebBrowser 时出现访问冲突

转载 作者:太空宇宙 更新时间:2023-11-03 15:08:22 25 4
gpt4 key购买 nike

我在多个线程中使用 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(true);

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

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

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

异常字符串:

Exception thrown: 'System.AccessViolationException' in System.Windows.Forms.dll

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

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

我试过:

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

我也知道 WebRequest、WebClient 和 HMTLAgilityPack,但我使用 WebBrowser 是为了它的 Javascript 支持。

最佳答案

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

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

我已经对它进行了 100000 多次执行测试,所以我认为它是通过的。

我写这篇文章是因为它在这种情况下对我来说是一种解决方案,可能对其他人有用,但是,我没有将其标记为已回答,因为我仍然不明白为什么会出现异常以及是否存在异常处理或预防这种情况的更好方法。

关于c# - 在多线程中使用 WebBrowser 时出现访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42283761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com