最初,我认为这应该很简单,而且肯定会有一种简单的方法来实现这一目标。现在我不太确定了。这是我想做的。
我将冗长的下载任务卸载到我通过CancellationToken
的Parallel.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()
之后起作用。