【问题标题】:AcessViolationException was unhandled VB.netAcessViolationException 未处理 VB.net
【发布时间】:2014-03-27 11:14:54
【问题描述】:

所以我有这个加载页面的表单,加载页面后我想将源插入 RichTextBox1.Text

但是在页面加载后程序崩溃(?)并给我这个错误

“Awesomium.Windows.Forms.dll 中发生了“System.AccessViolationException”类型的未处理异常

附加信息:试图读取或写入受保护的内存。这通常表明其他内存已损坏。”

这是我的代码,值得一提的是,我为此使用了 awesomium!

Public Class Form1
Dim Thread As System.Threading.Thread
Dim html_source_code As String = ""
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Control.CheckForIllegalCrossThreadCalls = False
    Thread = New System.Threading.Thread(AddressOf Load_Page)
    Thread.Start()

End Sub

Private Sub Load_Page()
    While html_source_code = ""
        If WebControl1.IsDocumentReady Then
            html_source_code = WebControl1.ExecuteJavascriptWithResult("document.documentElement.outerHTML").ToString()
            RichTextBox1.Text = html_source_code
        End If
    End While
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Thread = New System.Threading.Thread(AddressOf Load_Page)
    Thread.Start()
End Sub
End Class

提前致谢!

【问题讨论】:

    标签: vb.net multithreading awesomium


    【解决方案1】:

    这是你的第一个线索......

    Control.CheckForIllegalCrossThreadCalls = False

    这是一个非常明显的危险信号。除非出于非常特定的调试目的,并且有很好的理由,否则您永远不应该使用它。鉴于您的代码的其余部分充满了非法的跨线程调用,难怪您的程序会崩溃。

    您编写的在工作线程中执行的每一行代码都涉及 UI 组件。你不可以做这个。有关示例,请参阅此帖子:Cross-thread operation not valid

    UI 控件由应用程序的主线程持续操作。主线程必须能够访问它们以处理它们的关联事件,将它们绘制到屏幕上等。如果另一个线程正在修改它们的内容主线程正在尝试读取或写入它们然后坏事发生了。

    考虑一个主线程试图在屏幕上绘制的文本框。它获取对包含文本框文本的字符串位置的引用,并且在读取字符串的过程中,另一个线程修改了字符串,从而使主线程正在使用的引用无效。当主线程尝试读取时,其现有引用现在指向无效的内存位置,瞧,访问冲突。

    在几乎所有情况下,您都不应该将CheckForIllegalCrossThreadCalls 设置为False。将其设置为True 将引发异常,但它使您有机会查看有问题的代码在哪里并允许您更正它。设置它False 只是隐藏了非法调用,它可能会失败也可能不会失败,当这些非法调用最终导致问题时,您的应用程序将容易受到随机错误故障的影响。建议您阅读有关如何编写多线程 .NET 应用程序的内容。一个好的开始会在这里:StackOverflow Search

    另见:How to: Make Thread-Safe Calls to Windows Forms Controls

    【讨论】:

    • 但删除它或将其设置为 true 并没有什么不同。我不认为这是导致问题的原因。现在你发给我的最后一个链接包括 2198734 行代码,这对我来说太多了,无法在我的脑海中处理!我只想要一个快速简单的答案。
    • @Thomja 将其设置为 true 将引发异常而不是访问冲突。你的代码和你的方法是完全错误的——它需要完全重写。 没有快速简单的答案。多线程并不简单。要么花时间了解它是如何工作的,要么在没有线程的情况下编写代码。教授所有这些对于 StackOverflow 上的一个答案来说太过分了。你需要学习。
    • 我怀疑,我遵循了一个 youtube 教程,但它被用于更简单的事情,比如计数器。谢谢你的建议。
    猜你喜欢
    • 2013-08-10
    • 2012-11-24
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多