2013-09-16 3 views
-2

я реализовал прогресс бар, как это:BackgroundWorker ошибочна

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 

И я обрабатывать BackgroundWorker «s 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 

Но когда я делаю это:

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

Где sender - Объект, он выдает ошибку:

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

TableCreation всего лишь форма в моем проекте.

+0

Что такое отправитель, когда вы вызываете _bw_DoWork (отправитель, e1) _ – BlackICE

+1

Никогда не пишите '= True' или' Step 1'. Кроме того, вы посмотрели документацию для «BackgroundWorker», чтобы узнать, как использовать «BackgroundWorker»? Это не так. – Ryan

+0

@minitech Да, я знаю, что предполагается использовать. И у меня есть поиск в документации, но, к сожалению, я не могу понять использование фонового работника. Очевидно, что мне нужна помощь здесь. –

ответ

6

Нельзя напрямую звонить bw_DoWork(). Вот где происходит ошибка, вы отправляете объект sender в текущем контексте (вашу форму), а затем пытаетесь сделать его как BackgroundWorker.

Вместо этого вы должны добавить обработчик к вашему DoWork Sub,

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

И тогда вместо вызова bw_DoWork() непосредственно, сделайте bw.RunWorkerAsync(). Затем это вызовет событие DoWork и вызовет этот метод. Тогда ваш sender будет BackgroundWorker.

+0

Когда я делаю это с 'bw_DoWork', он пропускает ошибку. Для предложения Handle требуется переменная WithEvents, определенная в содержащем типе или одном из ее базовых типов. –

+2

Это потому, что для того, чтобы это решение работало, вам нужно сбросить 'BackgroundWorker' на вашу форму в дизайнере форм. Вы найдете его в разделе «Компоненты» окна инструментов. Убедитесь, что вы переименовали его в 'bw' или изменили предложение' Handles' на любое фактическое имя, которое вы ему даете. –

Смежные вопросы