我实现了这样的进度条:
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)
我处理了这个子事件中BackgroundWorker的DoWork事件:
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_store.TableCreation'的对象强制转换为'System.ComponentModel.BackgroundWorker'.
TableCreation 只是我项目中的一个表单.
你不应该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.