2016-03-22 33 views
0

BackgroundWorker.CancelAsync() çalışmıyor bir sorun yaşıyorum. WorkerSupportsCancellation, TRUE olarak ayarlanmış. Ayrıca DoWork'ta BackgroundWorker1.CancellationPending'i okuyorum. İşte elde etmeye çalıştığım şeyin örnek kodudur. Zaman damgasıyla döngü yapan ve Ölçüm değişkenine bir değer atan arka plan çalışanım var. Son bildirilen Ölçüm değişkenini sorgulayan ve liste kutusuna yazan bir altprogramım var. 5 döngüden sonra BackgroundWorker.CancelAsync() yolladım. İptalin beklemede olduğunu görebiliyorum, ancak aslında arka plan işçisini iptal etmiyor. Bu bir yarış durumu mu?vb.net background background çalışmıyor

Public Class Form1 

Dim Measurement As String 
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 

    BackgroundWorker1.RunWorkerAsync() 
    Delay(0.5) 

    For x = 1 To 5 
     ListBox1.Items.Add(Measurement) 
     ListBox1.TopIndex = ListBox1.Items.Count - 1 
     TextBox1.Text = BackgroundWorker1.CancellationPending 
     Delay(1) 
    Next 

    BackgroundWorker1.CancelAsync() 

    TextBox1.Text = BackgroundWorker1.CancellationPending 
    ListBox1.Items.Add("Cancel Pend: " & BackgroundWorker1.CancellationPending) 
    Delay(5) 
    ListBox1.Items.Add("Busy: " & BackgroundWorker1.IsBusy) 

End Sub 

Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 

    If BackgroundWorker1.CancellationPending = True Then 
     e.Cancel = True 
     BackgroundWorker1.Dispose() 
     Exit Sub 
    Else 
     Do 
      Measurement = Now() 
     Loop 
    End If 

End Sub 

End Class

+2

Döngünün içindeki iptalin çekini kontrol edin (veya kopyalayın) – Steve

+0

Wow ... bunu kaçırdığıma inanamıyorum ... teşekkürler Steve! – HurstOlds

+0

@HurstOlds Düğmenizi tekrar tıkladığınızda ne olur? Eğer oradaki BackgroundWorker1.Dispose() 'ise ... ne olduğunu biliyorum :) – Codexer

cevap

1
Sadece Do içindeki iptali için onay taşımak gerekir

... Döngü aksi takdirde DoWork olay işleyicisi başlangıcında ve asla

sonra ancak test edilecektir
Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 

    If BackgroundWorker1.CancellationPending = True Then 
     e.Cancel = True 
     BackgroundWorker1.Dispose() 
    Else 
     Do 
      If BackgroundWorker1.CancellationPending = True Then 
      e.Cancel = True 
      BackgroundWorker1.Dispose() 
      Exit Do 
      Else 
      Measurement = Now() 
      End If 
     Loop 
    End if 
End Sub