我在多个线程中使用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。
我试过了:
我也了解WebRequest,WebClient以及关于HMTLAgilityPack的其他内容,但我正在使用WebBrowser来支持它。
答案 0 :(得分:0)
在我的情况下,可通过的解决方案是使用方法上的System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions
属性来处理访问冲突异常。
经过一些测试后,我发现只是捕获异常并重试相同的方法,异常被抛出,因为执行继续正常,没有任何不可预见的异常。
我已经测试了更多的100000次执行,所以我认为这是一次传球。
我正在写这个,因为它在这种情况下可以作为我的解决方案,并且可能对其他人有用,但是,我并没有将其标记为已回答,因为我仍然不明白为什么会出现异常,如果有的话处理或防止这种情况的更好方法。