我尝试了背景工作但不起作用,因为我需要在每个步骤更新我的表单,而backgroundworker.progresschanged只能作为百分比工作。如果它只是一步,它可以用一个完成。我还考虑过制作10个不同的后台工作人员并这样做。但那我将如何制定例外情况并显示例外情况。我的每个try语句都实现了excel函数和excel工作簿函数。这在背景工作者中也是不可能的。
Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
pctrBoxStep1.Image = My.Resources.Yellow1
lblStep1.BackColor = Color.Yellow
workbook.Activate()
Try
'some stuff
Catch ex As Exception
int = -1
pctrBoxStep1.Image = My.Resources.red
lblStep1.BackColor = Color.Red
MessageBox.Show("There was an Error!!" & Environment.NewLine & ex.Message, "Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error)
End Try
'Repeat for 9 more steps
End Sub
答案 0 :(得分:0)
我的每个try语句都实现了excel函数和excel工作簿函数。这在背景工作者中也是不可能的。
See this question.这是我能想到为什么你在BackgroundWorker中使用Excel函数时遇到问题的唯一原因。
我还考虑过让10名不同的背景工作者这样做。但那我将如何制定例外并显示例外情况。
根据您的描述,这可能是我采取的方法。听起来你根本不需要跟踪每个工人的进度百分比。在这种情况下,我会在ReportProgress
语句中使用Catch
调用 。类似的东西:
Private Sub bgwStep1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgwStep1.DoWork
Try
'some stuff
Catch ex As Exception
bgwStep1.ReportProgress(0)
System.Threading.Thread.Sleep(1000) 'Precautionary
End Try
End Sub
Private Sub bgwStep1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwStep1.ProgressChanged
int = -1
pctrBoxStep1.Image = My.Resources.red
lblStep1.BackColor = Color.Red
bgwStep1.CancelAsync()
End Sub
Private Sub bgw1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw1.RunWorkerCompleted
bgw2.RunWorkerAsync()
End Sub
注意:
WorkerSupportsCancellation
属性设置为True
。Sleep
以确保UI线程在完成之前有时间取消BackgroundWorker。