我有async如下所示的方法。cancel當用戶決定停止作業時,我希望有可能。我怎么能在新按鈕中做到這一點CancelUpdate_Click
Private Async Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click
Await DoWorkAsync()
End Sub
Private Function DoWorkAsync() As Task(Of List(Of Vals))
Return _
Task.Run(
Async Function() _
_migrator.PrepareMigration(CInt(Invoke(New Func(Of Integer)(Function() lbNumms.SelectedValue))), CInt(Invoke(New Func(Of Integer)(Function() lbPro.SelectedValue)))))
End Function
Private Sub CancelUpdate_Click(sender As Object, e As EventArgs) Handles CancelUpdate.Click
'Stop DoWorkAsync if running
End Sub
更新:
Private _tokenSource As New CancellationTokenSource()
Private ReadOnly _token = _tokenSource.Token
Private Async Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click
Try
Private ReadOnly _tokenSource As New CancellationTokenSource()
Private ReadOnly _token = _tokenSource.Token
Await DoWorkAsync()
Catch oe As OperationCanceledException
MessageBox.Show("Task has been cancelled")
Finally
_tokenSource.Dispose()
End Try
End Sub
Private Function DoWorkAsync() As Task(Of List(Of Vals))
Return _
Task.Run(
Function()
Dim tokenSource = New CancellationTokenSource()
Dim token = tokenSource.Token
Return _migrator.PrepareMigration(CInt(Invoke(New Func(Of Integer)(Function() lbNumms.SelectedValue))), CInt(Invoke(New Func(Of Integer)(Function() lbProducent.SelectedValue))), _token)
End Function)
End Function
Public Function PrepareMigration(value1 As Integer, value2 As Integer, cancellationToken As CancellationToken) As List(Of Vals))
cancellationToken.ThrowIfCancellationRequested()
MethodA()
cancellationToken.ThrowIfCancellationRequested()
MethodB()
End Function
Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
_tokenSource.Cancel()
End Sub
uj5u.com熱心網友回復:
取消不是神奇的東西。它必須明確編碼。在這種情況下,您的PrepareMigration例程需要獲取一個CancellationToken引數,并且需要定期檢查該引數的IsCancellationRequested屬性是否已設定為True.
這樣做的一種捷徑是定期呼叫ThrowIfCancellationRequested令牌;這將導致一個OperationCanceledExceptionif 屬性被設定。
如果您正在處理回傳 a 的例程,Task則可以回傳Task.FromCanceled.
你會得到CancellationToken從 a 傳入的CancellationTokenSource。然后取消按鈕的事件處理程式將呼叫Cancel源以發出發出令牌的信號。
例如,如果您有涉及多個步驟的處理,它可能會像這樣作業:
'Include other parameters as appropriate.
Sub PrepareMigration(ByVal token As CancellationToken)
DoStep1()
token.ThrowIfCancellationRequested()
DoStep2()
'...
token.ThrowIfCancellationRequested()
DoStepn()
End Sub
或者,如果你有一些東西正在處理一組專案,也許它看起來像這樣:
Sub PrepareMigration(ByVal token As CancellationToken)
For Each item In itemsToProcess
token.ThrowIfCancellationRequested()
DoTheItem(item)
Next
End Sub
根據需要混合搭配。如果在特定步驟中呼叫的例程運行時間特別長,則該例程本身可能需要取消感知。
最終,您放置檢查的位置取決于計算步驟的詳細資訊(包括可能的“快速”與“緩慢”步驟)以及您希望設定的用戶必須等待多長時間的限制,直到請求的取消生效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/465948.html
上一篇:獲取SVM錯誤預測的影像名稱
