处理Vb.Net表单中的跨线程异常

Dar*_*vil 2 vb.net user-controls multithreading winforms

我有一个Windows窗体,我已声明自定义控件(标签,面板文本框),问题是我在本地线程中加载该控件的图像,但有些图片不能从网络流下载,因此例外,现在我在Catch块中设置图像属性Nothing ,并尝试设置其他UI面板属性,但它抛出异常,

例外:

"交叉线程操作无效:控制"XXXXXXXXXX"从创建它的线程以外的线程访问."

请有人告诉在发生异常时设置属性的最简单方法,以便我可以设置其他控件的属性.

jmc*_*ney 6

基本上,您不会触摸在辅助线程上执行的方法中的控件.仅触摸UI线程上的控件.通常你可以这样做的地方:

myPictureBox.Image = myImage
Run Code Online (Sandbox Code Playgroud)

你现在写一个像这样的方法:

Private Sub SetPictureBoxImage(img As Image)
    If myPictureBox.InvokeRequired Then
        myPictureBox.BeginInvoke(New Action(Of Image)(AddressOf SetPictureBoxImage), img)
    Else
        myPictureBox.Image = img
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

然后在辅助线程上调用它,而不是直接设置Image属性:

SetPictureBoxImage(myImage)
Run Code Online (Sandbox Code Playgroud)

请注意,无论是在UI线程还是辅助线程上调用它,该方法都将成功,因此无论您是否知道自己位于辅助线程,都可以调用它.

查看此信息以获取更多信息.

编辑

Private Sub UpdateUI(img As Image, visible As Boolean)
    If Me.InvokeRequired Then
        Me.BeginInvoke(New Action(Of Image, Boolean)(AddressOf UpdateUI), img, visible)
    Else
        myPictureBox.Image = img
        myPanel.Visible = visible
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

请注意,我使用了表单的InvokeRequired和Invoke成员而不是特定的控件.实际上,只要它们由同一个UI线程拥有,那么哪些形式或控件是成员并不重要,但对我而言,如果只有一个或者使用该表单,则使用相同的控件进行更新似乎是合乎逻辑的.

另请注意,委托的签名会更改以匹配方法的签名,以便它们具有相同数量和类型的参数.

  • 给我时间写吧!> :( (2认同)