-2

I implemented a progress bar like this:

TableCreation.ProgressBar2.Value = 0
TableCreation.ProgressBar2.Maximum = CInt(FieldsNumber)
'==================
For SecondLoopCount = 1 To CInt(FieldsNumber) Step 1
    '----------------------------------------------
    TableCreation.ProgressBar2.Value = SecondLoopCount
    TableCreation.ProgressBar2.Refresh()
    TableCreation.ProgressBar2.Show()
    ' ....... Some Code ......
Next

And I handle the BackgroundWorker’s DoWork event in this sub:

Public Shared Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
    Dim bw As BackgroundWorker = New BackgroundWorker
    Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
    For i = 1 To 10
        If worker.CancellationPending = True Then
            e.Cancel = True
            Exit For
        Else
            ' Perform a time consuming operation and report progress.
            System.Threading.Thread.Sleep(500)
            worker.ReportProgress(i * 10)
        End If
    Next
End Sub

But when I do this:

Dim e1 As System.ComponentModel.DoWorkEventArgs
TableCreation.ProgressBar2.Value = SecondLoopCount
TableCreation.ProgressBar2.Refresh()
TableCreation.ProgressBar2.Show()
bw_DoWork(sender, e1)

Where sender is an Object, it throws an error:

Unable to cast object of type 'e_store.TableCreation' to type 'System.ComponentModel.BackgroundWorker'.

TableCreation is just a form in my project.

4

1 回答 1

6

你不应该bw_DoWork()直接打电话。这就是发生错误的地方,您正在sender当前上下文(您的表单)中发送对象,然后尝试将其转换为BackgroundWorker.

您应该改为将处理程序添加到您的DoWorkSub,

Public Shared Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles bw.DoWork

然后不要直接调用bw_DoWork(),而是执行bw.RunWorkerAsync(). 这将引发DoWork事件并调用该方法。然后,您sender将成为 BackgroundWorker。

于 2013-09-16T16:15:25.257 回答