Hallo,
ich versuche zu verstehen wie das mit den Token funktioniert und wie man einen Task abbricht. Ich hab da bissle was an nem Beispiel rumgebastelt.
Das wirft eine OperationCanceledException (ohne den Try Block), die wird im Beispiel auch erwähnt. Und ich denke mal die wird mit dem Try Catch dann abgefangen, allerdings scheine ich da irgendwo hängenzubleiben
Was ich eigentlich wollte war den Task starten und beenden zu können mit den Buttons. Was ist das Problem hier?
Spoiler anzeigen
Ursprüngliches Beispiel:
Spoiler anzeigen
ich versuche zu verstehen wie das mit den Token funktioniert und wie man einen Task abbricht. Ich hab da bissle was an nem Beispiel rumgebastelt.
Das wirft eine OperationCanceledException (ohne den Try Block), die wird im Beispiel auch erwähnt. Und ich denke mal die wird mit dem Try Catch dann abgefangen, allerdings scheine ich da irgendwo hängenzubleiben
Was ich eigentlich wollte war den Task starten und beenden zu können mit den Buttons. Was ist das Problem hier?
VB.NET-Quellcode
- Public Class Form1
- Private progress As Integer
- Private TokenSource As New CancellationTokenSource
- Private token As CancellationToken = TokenSource.Token
- Private t1 As Task
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
- t1 = Task.Run(Sub() start())
- t1.Wait()
- End Sub
- Private Sub start()
- End Sub
- Private Sub startButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles startButton.Click
- If t1.Status = TaskStatus.RanToCompletion OrElse t1.Status = TaskStatus.Canceled Then
- t1 = Task.Run(Sub() bgw1(token), token)
- End If
- End Sub
- Private Sub cancelButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cancelButton.Click
- TokenSource.Cancel()
- Try
- t1.Wait()
- Catch ex As AggregateException
- For Each item In ex.InnerExceptions
- MessageBox.Show(ex.Message & " " & item.Message)
- Next
- Finally
- TokenSource.Dispose()
- End Try
- End Sub
- Private Sub bgw1(ct As CancellationToken)
- If ct.IsCancellationRequested Then
- ct.ThrowIfCancellationRequested()
- Invoke(Sub() Resultlabel.Text = "Did not start")
- End If
- progress = 0
- For i = 1 To 10
- System.Threading.Thread.Sleep(500)
- progress = i * 10
- Invoke(Sub() Resultlabel.Text = progress.ToString + "%")
- If ct.IsCancellationRequested Then
- ct.ThrowIfCancellationRequested()
- Invoke(Sub() Resultlabel.Text = "Canceled")
- End If
- Next i
- End Sub
- End Class
Ursprüngliches Beispiel:
VB.NET-Quellcode
- Module Test
- Sub Main()
- Dim tokenSource2 As New CancellationTokenSource()
- Dim ct As CancellationToken = tokenSource2.Token
- Dim t2 = Task.Factory.StartNew(Sub()
- ct.ThrowIfCancellationRequested()
- Dim moreToDo As Boolean = True
- While moreToDo = True
- If ct.IsCancellationRequested Then
- ct.ThrowIfCancellationRequested()
- End If
- End While
- End Sub
- tokenSource2.Cancel()
- Try
- t2.Wait()
- Catch e As AggregateException
- For Each item In e.InnerExceptions
- Console.WriteLine(e.Message & " " & item.Message)
- Next
- Finally
- tokenSource2.Dispose()
- End Try
- Console.ReadKey()
- End Sub
- End Module
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()