【发布时间】: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