【发布时间】:2020-02-24 08:17:41
【问题描述】:
几天来,我一直在努力寻找如何将 BackgroundWorker 正确合并到我的功能中的解决方案,并且我能够正确显示流程开发、流程停止、报告。
这是我的代码
Private Sub Frm_ImportLeumobileGK_FormClosing(sender As Object, e As Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
Me.BackgroundWorker1.CancelAsync()
Me.Timer1.Enabled = False
Me.DialogResult = DialogResult.Cancel
e.Cancel = True
End Sub
Private Sub Btn_OK_Click(sender As Object, e As EventArgs) Handles btn_OK.Click
ListView1.Items.Clear()
resetCounter()
BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim worker As BackgroundWorker = TryCast(sender, BackgroundWorker)
TestPut_All_CDRs_To_FakturaPos(worker, e,
MasterMandantConnectionString:=MasterMandantConnectionString,
StartDate:=dtp_Start.Value,
EndDate:=dtp_End.Value,
min_Nr:=tb_Min_Nr.Value,
max_Nr:=tb_Max_Nr.Value)
End Sub
Sub TestPut_All_CDRs_To_FakturaPos(worker As BackgroundWorker, e As DoWorkEventArgs, MasterMandantConnectionString As String, StartDate As Date, EndDate As Date, min_Nr As Integer, max_Nr As Integer)
Dim n As Integer = 0
Dim MobCdrs As List(Of String)
ProgressBar1.Maximum = (max_Nr - min_Nr)
For Mob_Nr = min_Nr To max_Nr
n += 1
If worker.CancellationPending Then
e.Cancel = True
Else
MobCdrs = TestPut_Mob_CDRs_To_FakturaPos(MasterMandantConnectionString:=MasterMandantConnectionString,
StartDate:=StartDate,
EndDate:=EndDate,
Mob_Nr:=Mob_Nr)
For Each currentError In MobCdrs
If (currentError <> "") Then
ListView1.Items.Add(currentError)
End If
Next
If n > ProgressBar1.Maximum Then
n = ProgressBar1.Maximum
End If
ProgressBar1.Value = n
End If
Next
ListView1.Items.Insert(0, getImportInfo(), 0)
labelInfo.Text = "Test successfully completed."
End Sub
Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
ProgressBar1.Value = e.ProgressPercentage
End Sub
Private Sub Frm_FormClosing(sender As Object, e As Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
If BackgroundWorker1 IsNot Nothing Then
Me.BackgroundWorker1.CancelAsync()
Me.Close()
End If
结束子
使用Documentation,我尝试将BackgroundWorker 应用到我的“TestPut_All_CDRs_To_FakturaPos”函数,不幸的是失败了,因为我得到了 ProgressBar1.Maximum error = ***"System.InvalidOperationException: "无效的跨线程操作:访问了 ProgressBar1 控件来自创建它的线程以外的线程。”***请建议,我在哪里例外?
【问题讨论】: