gpt4 book ai didi

vb.net - 如何停止/取消处理功能的任务或找到更好的方法来执行此操作?

转载 作者:行者123 更新时间:2023-12-02 11:30:49 37 4
gpt4 key购买 nike

我有...

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

...

Dim cts As New CancellationTokenSource
Dim oToken As CancellationToken = cts.Token

'Create HelperTask to wait for cancellation request
Dim oHelperTask As Task = Task.Factory.StartNew(Function()

'Create Task to invoke function
Dim oTask As Task = Task.Factory.StartNew(Function()
Return outerFunction.Invoke
End Function, oToken)

' wait for cancellation token if Task is not complete
While oTask.Status = TaskStatus.Running
Thread.Sleep(200)
If oToken.IsCancellationRequested Then
oToken.ThrowIfCancellationRequested()
Return Nothing
End If
End While

Return oTask.Result

End Function, oToken)


cts.cancel()

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

最佳答案

CancellationToken 的全部意义在于,实际的工作人员 lambda(或函数)应该检查它以查看是否应该停止。在您的情况下,TestTask 必须有权访问 token 并在每次迭代后检查它。多个辅助任务、任务状态检查或取消请求检查都不是必需的。

关于 Task Cancelation 的 MSDN 文章显示 lambda 唯一需要的就是检查 token ,仅此而已。

就您而言,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

唯一需要的是将 token 传递给 TestTask 并像这样启动它:

        Task.Factory.StartNew(Sub() TestTask(token), token)

关于vb.net - 如何停止/取消处理功能的任务或找到更好的方法来执行此操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10835800/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com