我正在將我的代碼從 BackgroundWorker 更新到 Tasks 并且遇到了問題。我想模仿 BackgroundWorker 具有的功能,當DoWork()執行緒完成時,BackgroundWorker 呼叫該DoWorkCompleted()函式。這是我到目前為止所擁有的:
Private Sub btn_Start_Click(sender, e) Handles btn_Start.Click
btn_Stop.IsEnabled = True
btn_Start.IsEnabled = False
_cts = New CancellationTokenSource()
Dim theWork As Task = Worker.Start(_cts.Token)
theWork.ContinueWith(AddressOf OnWorkCompleted)
End Sub
Private Sub OnWorkCompleted()
btn_Stop.IsEnabled = False
btn_Start.IsEnabled = True
End Sub
Private Sub btn_Stop_Click(sender, e) Handles btn_Stop.Click
_cts.Cancel()
End Sub
然后在另一個檔案 Worker.vb 中,我有以下內容:
Private Shared _cts As CancellationToken
Public Shared Function Start(token As CancellationToken) As Task
Try
_cts = token
Return Task.Run(AddressOf Process, token)
Catch ex As TaskCanceledException
MessageBox.Show("Task cancelled")
Return Task.CompletedTask
End Try
End Function
Private Shared Async Sub Process()
Try
Log.Information("0")
Await Task.Delay(1000, _cts)
Log.Information("1")
Await Task.Delay(1000, _cts)
Log.Information("2")
Await Task.Delay(1000, _cts)
Log.Information("3")
Await Task.Delay(1000, _cts)
Log.Information("4")
Await Task.Delay(1000, _cts)
Catch ex As OperationCanceledException
MessageBox.Show("cancelled operation")
End Try
End Sub
幾乎,我希望這段代碼發生的事情是模仿完整代碼在遷移時會發生的情況:用戶單擊開始后,長時間操作在單獨的執行緒上運行,并且 UI 仍然回應。如果用戶在任何時候單擊停止,則任務將結束并OnWorkCompleted呼叫該函式。會發生什么,是立即呼叫 OnWorkCompleted() 而不是單擊 Stop 時。
uj5u.com熱心網友回復:
作為一般規則,您應該避免Async Sub:
Private Shared Async Function Process() As Task
此外,使用Await代替ContinueWith:
Private Async Sub btn_Start_Click(sender, e) Handles btn_Start.Click
btn_Stop.IsEnabled = True
btn_Start.IsEnabled = False
_cts = New CancellationTokenSource()
Try
Await Worker.Start(_cts.Token)
Finally
OnWorkCompleted()
End Try
End Sub
您可能會發現我關于替換BackgroundWorker的Task.Run博客文章系列很有幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/459306.html
