BackgroundWorker的发件人错了

Lef*_*nis -2 .net vb.net

我实现了这样的进度条:

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
Run Code Online (Sandbox Code Playgroud)

我处理了这个子事件中BackgroundWorkerDoWork事件:

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
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时:

Dim e1 As System.ComponentModel.DoWorkEventArgs
TableCreation.ProgressBar2.Value = SecondLoopCount
TableCreation.ProgressBar2.Refresh()
TableCreation.ProgressBar2.Show()
bw_DoWork(sender, e1)
Run Code Online (Sandbox Code Playgroud)

senderObject 在哪里,它会抛出一个错误:

无法将类型为'e_s​​tore.TableCreation'的对象强制转换为'System.ComponentModel.BackgroundWorker'.

TableCreation 只是我项目中的一个表单.

hel*_*ich 6

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

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

Public Shared Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles bw.DoWork
Run Code Online (Sandbox Code Playgroud)

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

  • 这是因为,为了使这个解决方案有效,你需要在表单设计器中将`BackgroundWorker`放到你的表单上.您可以在工具箱的"组件"部分找到它.确保将其重命名为`bw`,或将`Handles`子句更改为您给它的任何实际名称. (2认同)