2

私は持っています ...

Private Sub TestTask()
    Debug.Write("Running")

    For i As Integer = 0 To 60
        Debug.Write(".")
        System.Threading.Thread.Sleep(1000)
    Next

    Debug.WriteLine("Finished")
End Sub

...。

Dim cts As New CancellationTokenSource
Dim oToken As CancellationToken = cts.Token

'Create HelperTask to wait for cancellation request
Dim oHelperTask As Task = Task.Factory.StartNew(Function()

        'Create Task to invoke function
        Dim oTask As Task = Task.Factory.StartNew(Function()
            Return outerFunction.Invoke
        End Function, oToken)

        ' wait for cancellation token if Task is not complete
        While oTask.Status = TaskStatus.Running
            Thread.Sleep(200)
            If oToken.IsCancellationRequested Then
                oToken.ThrowIfCancellationRequested()
                Return Nothing
            End If
        End While

        Return oTask.Result

End Function, oToken)


cts.cancel()

しかし、ビジュアルsudioのデバッグウィンドウでは、TestTask()は引き続き実行されます.....誰かに教えてください。ありがとう

4

2 に答える 2

4

CancellationTokenの要点は、実際のワーカーラムダ(または関数)がそれをチェックして、停止する必要があるかどうかを確認する必要があるということです。あなたの場合、TestTaskはトークンにアクセスし、各反復後にトークンをチェックする必要があります。複数のヘルパータスク、タスクステータスのチェック、キャンセルリクエストのチェックは必要ありません。

タスクのキャンセルに関するMSDNの記事では、ラムダがトークンをチェックするだけで、それ以上のことは何も必要ないことが示されています。

あなたの場合、TestTaskは次のような単純なコードでキャンセルに応答できます。

Sub Main()
    Dim cts As New CancellationTokenSource
    Dim token = cts.Token

    Task.Factory.StartNew(Sub() TestTask(token), token)

    Thread.Sleep(3000)
    cts.Cancel()
    Console.ReadKey()
End Sub



Private Sub TestTask(token As CancellationToken)
    Console.Write("Running")

    For i As Integer = 0 To 60

        token.ThrowIfCancellationRequested()

        Console.Write(".")
        Thread.Sleep(1000)
    Next

    Console.WriteLine("Finished")
End Sub

必要なのは、トークンをTestTaskに渡し、次のように開始することだけです。

        Task.Factory.StartNew(Sub() TestTask(token), token)
于 2012-06-01T07:14:26.833 に答える
3

2つのタスクは必要ありません。これは協調的なキャンセルであるため、cancelが呼び出されたときに終了するすべてのタスクには、ThrowIfCancellationRequestedを含める必要があります(ただし、キャンセルを処理する必要があります)。意図的にThread.Abortタイプの動作/セマンティクスはありません。すべて協調的です。

于 2012-05-31T15:06:36.843 に答える