【问题标题】:Restarting a task after being cancelled by a cancellation token被取消令牌取消后重新启动任务
【发布时间】:2018-02-09 09:54:42
【问题描述】:

最初我认为这应该很简单,而且肯定会有一种简单的方法来实现这一点。现在我不再那么确定了。这就是我想做的事情。

我正在将一个冗长的下载任务卸载到 Parallel.Foreach 循环,我将 CancellationToken 传递给该循环。如果用户单击“取消”按钮,则调用令牌的CancellationTokenSource.Cancel 方法并按原样终止循环。

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

这里是代码(简写为要领):

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

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

【问题讨论】:

    标签: .net vb.net parallel.foreach cancellationtokensource cancellation-token


    【解决方案1】:

    只是为了后代,这是Hans在上面的comment中建议的答案:

    我只是添加了一行

    cTokenSource = New CancellationTokenSource
    

    InitialiseTiles() 之后就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      相关资源
      最近更新 更多