被取消令牌取消后重新启动任务



最初,我认为这应该很简单,而且肯定会有一种简单的方法来实现这一目标。现在我不太确定了。这是我想做的。

我将冗长的下载任务卸载到我通过CancellationTokenParallel.Foreach循环中。如果用户单击"取消"按钮,则可以调用令牌的CancellationTokenSource.Cancel方法,并且循环按应有的终止。

我希望用户能够根据需要取消和重新启动循环,但我不知道该怎么做,因为您只能使用一次CancellationTokenSource。我必须将其声明为全局变量,以便在取消按钮事件处理程序以及从Parallel.Foreach循环开始的代码中可见。

这是代码(缩写为Essentials(:

Public Class frmMain
    Private cTokenSource As New CancellationTokenSource
    Sub btnStart(sender As Object, e As EventArgs) Handles btnStart.Click
        InitialiseTiles()
        Dim t As Task = Task.Factory.StartNew(Sub()
                                                  Dim ParallelOptions As New ParallelOptions() With {
                                                                                                .CancellationToken = cTokenSource.Token,
                                                                                                .MaxDegreeOfParallelism = txtNTasks.Text,
                                                                                                .TaskScheduler = Nothing
                                                                                                }
                                                  Parallel.ForEach(Tiles, ParallelOptions, Sub(aTile)
                                                                                               Try
                                                                                                   Dim myWebClient As New WebClient
                                                                                                   myWebClient.DownloadFile(TMS & aTile, TilePath & aTile)
                                                                                               Catch ex As Exception
                                                                                                   Debug.Print("Got a problem: " & ex.Message)
                                                                                               End Try
                                                                                           End Sub)
                                              End Sub)

    End Sub
    Private Sub btnAbort_Click(sender As Object, e As EventArgs) Handles btnAbort.Click
        cTokenSource.Cancel()
    End Sub
End Class

这样做的正确方法是什么?

仅出于后代,这是汉斯在上面评论中提出的答案:

我只是添加了行

cTokenSource = New CancellationTokenSource

InitialiseTiles()之后起作用。

最新更新