1
夥計們,我有一個vb.net應用程序,我在其中按下按鈕時啓動後臺工作程序。 BGW永遠在一個Do循環中工作,除非我按另一個按鈕,在這種情況下它應該被停止,執行一些其他工作,然後BGW重新開始。如何正確取消永久生效的後臺工作人員?
我有兩個版本的代碼到目前爲止,基於在線研究,這兩種工作雖然給出不同的結果。到目前爲止的代碼是:
我工作了Dim autoEvent As New AutoResetEvent(False)
Private Sub StartWorkerButton_Click() Handles StartWorkerButton.Click
MyWorker.WorkerSupportsCancellation = True
MyWorker.WorkerReportsProgress = True
MyWorker.RunWorker.Asunc()
End Sub
Private Sub MyWorker_ProgressChanged() Handles MyWorker.Progresschanged
'Update some text boxes text string here based on data from the BGW work
End Sub
Private Sub StopThenRestartButton_Click Handles StopThenRestartButton.Click
If MyWorker.IsBusy Then
MyWorker.CancelAsync()
autoEvent.WaitOne()
' Do some work here
MyWorker.RunWorkerAsync() ' Restart BGW - But this fails!
Else
' Do same work here but without stopping and restarting BGW
End If
Exit Sub
Private Sub MyWorker_DoWork() Handles MyWorker.DoWork
Do While 1
If MyWorker.CancellationPending = True
e.Cancel = True
autoEvent.set
Exit Sub
Else
' Do some task work over and over again
'ReportProgress() here as well
End If
End Sub
無論怎樣,好像執行可以請求取消,設置的事件,而是因爲它似乎仍然被運行則不會重新啓動BGW。克。
代碼如果真的作品'永遠'然後有什麼可以做;) –
你應該使用'退出雖然'而不是'Exit Sub'並將'autoEvent.set'移動到'End Sub之前的while循環之外。 – bansi
您應該有一個名爲'restartWorker'的布爾變量,如果爲true,則在RunWorkerCompleted事件中重新啓動worker(檢查e.Cancelled屬性)。看起來您只希望在StopThenRestart方法中再次調用RunWorkerAsync時完成該工作。 – LarsTech