.net 具有backgroundworker的多表单实例
我有两种表格:主表格和面板表格。 主窗体包含2个按钮:bt_panel1和bt_panel2。 每个按钮的功能是:.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
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