Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何停止/取消处理函数的任务或找到更好的方法?_Vb.net_Delegates_Task Parallel Library - Fatal编程技术网

Vb.net 如何停止/取消处理函数的任务或找到更好的方法?

Vb.net 如何停止/取消处理函数的任务或找到更好的方法?,vb.net,delegates,task-parallel-library,Vb.net,Delegates,Task Parallel Library,我有 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 但在VisualSudio上的调试窗口中,我的TestTask()将继续运行。。。。。请

我有

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


但在VisualSudio上的调试窗口中,我的TestTask()将继续运行。。。。。请任何人启发我。谢谢

您不需要/不需要两个任务-这是协同取消,因此在调用cancel时,您想要结束的每个任务都需要包含ThrowIfCancellationRequested(或者它应该如何处理取消)。故意没有线程。中止类型的行为/语义,都是协作的。

CancellationToken的全部要点是,实际的工作者lambda(或函数)应该检查它,看它是否应该停止。在您的情况下,TestTask必须有权访问令牌,并在每次迭代后检查它。无需执行多个助手任务或任务状态检查或取消请求检查

上的MSDN文章介绍了lambda如何检查令牌,仅此而已

在您的情况下,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)

我不懂。如果我想在TestTask()函数完成执行之前取消我的任务,我需要第二个任务,不是吗?我真正的问题是TestTask()函数可能会挂起而无法完成,因为它依赖于第三方,所以我需要一种停止其执行的方法。如果我只使用一个任务,则在请求取消任务后,该功能仍将继续。
        Task.Factory.StartNew(Sub() TestTask(token), token)