- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在多个线程中使用 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。
我试过:
我也知道 WebRequest、WebClient 和 HMTLAgilityPack,但我使用 WebBrowser 是为了它的 Javascript 支持。
最佳答案
在我的例子中,可行的解决方案是使用方法上的 System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions
属性来处理访问冲突异常。
经过一些测试后,我发现只需捕获异常并重试抛出异常的相同方法即可正常工作,因为执行继续正常,没有任何不可预见的异常。
我已经对它进行了 100000 多次执行测试,所以我认为它是通过的。
我写这篇文章是因为它在这种情况下对我来说是一种解决方案,可能对其他人有用,但是,我没有将其标记为已回答,因为我仍然不明白为什么会出现异常以及是否存在异常处理或预防这种情况的更好方法。
关于c# - 在多线程中使用 WebBrowser 时出现访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42283761/
我是一名优秀的程序员,十分优秀!