.net 具有backgroundworker的多表单实例

.net 具有backgroundworker的多表单实例,.net,vb.net,backgroundworker,multiple-instances,onpaint,.net,Vb.net,Backgroundworker,Multiple Instances,Onpaint,我有两种表格:主表格和面板表格。 主窗体包含2个按钮:bt_panel1和bt_panel2。 每个按钮的功能是: Private Sub bt_panel1_Click(sender As System.Object, e As System.EventArgs) Handles bt_panel1.Click Dim panel1_run As New panel panel1_run.PANEL_NUM = 1 panel1_run.Name = "panel1_r

我有两种表格:主表格和面板表格。 主窗体包含2个按钮:bt_panel1和bt_panel2。 每个按钮的功能是:

Private Sub bt_panel1_Click(sender As System.Object, e As System.EventArgs) Handles bt_panel1.Click
    Dim panel1_run As New panel
    panel1_run.PANEL_NUM = 1
    panel1_run.Name = "panel1_run"
    panel1_run.Text = "PANEL 1"
    panel1_run.Show()
End Sub
关于bt_panel2,2而不是1

小组表格包括:

功能负载: 一个backgroundworker控件,它执行一些不相关的操作,并且其Runworker已完成: 功能漆: 如果我只打开一个面板,按主面板上的bt_panel1或bt_panel2,一切正常。 但如果我打开两个面板,按下主应用程序中的bt_panel1和bt_panel2不会响应,并且panel2是完全空白的,没有涂漆。 应用程序没有响应,我无法关闭面板,我无法关闭主。。。我必须终止调试才能关闭。 不调用异常。 未使用ReportProgress函数。 DoWork函数从SharedMemory区域读取一些数据panel1和Panel2的不同数据
我认为问题在于RunWorkerCompleted中的Me.Controls未引用表单的相应实例。

据我所知,后台工作线程无法从后台工作线程中引用UI或其控件,因此您可能认为Me.cocontrols语句有错正确。

应用程序崩溃是否包含异常或消息?如果是的话,你应该把它包括在你的问题中。它将提供有价值的信息。捕获异常而不报告异常是一种让代码行为不端的好方法,而不知道原因。认为后台工作人员与此类问题无关的假设是错误的。您将通过死锁或过于频繁地调用ReportProgress冻结UI。不,没有例外。应用程序没有响应,我无法关闭面板,我无法关闭主。。。我必须终止调试,panel2是完全空白的,没有绘制。
Private Sub panel_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    [...]
    'create 80 picturboxes 
    For i = 1 To 4
       For k = 1 To 20
          Dim picture As New PictureBox
          picture.Name = "pic" & i & "c" & k
          [...]
          Controls.Add(picture)
          AddHandler picture.Paint, AddressOf paintchar
       Next
    Next
    'start BackgroundWorker
     BackgroundWorker1.RunWorkerAsync()
End Sub 
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    Dim temp As PictureBox
    Try
       For i = 1 To 4
           For k = 1 To 20
               'for each picturebox call refresh (paintchar)
                temp = Me.Controls.Item("pic" & i & "c" & k)
                temp.Refresh()
           Next
       Next
       'restart BackgroundWorker1 continuosly
       BackgroundWorker1.RunWorkerAsync()
    Catch ex As Exception
       MsgBox("Error BackgroundWorker1_RunWorkerCompleted" & vbCrLf & ex.Message)
    End Try
End Sub
Private Sub paintchar(sender As System.Object, e As System.Windows.Forms.PaintEventArgs)
   [...]
   Try
      e.Graphics.FillEllipse(Brushes.LawnGreen, New RectangleF(loc, size))
   Catch ex As Exception
        MsgBox("Error paintchar" & vbCrLf & ex.Message)
   End Try
End Sub