我希望在没有表单冻结的情况下使用非常大的任务更新userform中的图片框

时间:2015-12-07 16:43:48

标签: vb.net visual-studio visual-studio-2013

我尝试了背景工作但不起作用,因为我需要在每个步骤更新我的表单,而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

1 个答案:

答案 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

注意:

  • 每个BackgroundWorker必须将其WorkerSupportsCancellation属性设置为True
  • 调用
  • Sleep以确保UI线程在完成之前有时间取消BackgroundWorker。
  • 保留抛出异常的数据有点复杂,但是this question说明了如果你决定走这条路,该怎么做。