具有超时取消请求的VB.Net Task.WaitAll

具有超时取消请求的VB.Net Task.WaitAll,vb.net,multithreading,task,cancellationtokensource,cancellation-token,Vb.net,Multithreading,Task,Cancellationtokensource,Cancellation Token,我知道这方面有一些线索和线索,但我似乎无法让它发挥作用 基本上,我有两个(或更多)任务要运行,但有一个超时,在此超时后,我希望所有任务都取消,并有一种方法知道我们已超时,以便我可以将其返回到我的网页 以下是我所拥有的: Dim cts As System.Threading.CancellationTokenSource = New System.Threading.CancellationTokenSource Dim oTask1 As Task(Of SearchReturn) = Ta

我知道这方面有一些线索和线索,但我似乎无法让它发挥作用

基本上,我有两个(或更多)任务要运行,但有一个超时,在此超时后,我希望所有任务都取消,并有一种方法知道我们已超时,以便我可以将其返回到我的网页

以下是我所拥有的:

Dim cts As System.Threading.CancellationTokenSource = New System.Threading.CancellationTokenSource

Dim oTask1 As Task(Of SearchReturn) = Task(Of SearchReturn).Factory.StartNew(
                         Function()
                             While Not cts.IsCancellationRequested
                                 cts.Token.ThrowIfCancellationRequested()
                                 Return Test1(oTest)
                             End While
                         End Function, cts.Token)

Dim oTask2 As Task(Of SearchReturn) = Task(Of SearchReturn).Factory.StartNew(
                         Function()
                             While Not cts.IsCancellationRequested
                                 cts.Token.ThrowIfCancellationRequested()
                                 Return Test2(oTest)
                             End While
                         End Function, cts.Token)

If Not Task.WaitAll({oTask1, oTask2}, 4000, cts.Token) Then cts.Cancel()
cts.Cancel()确实会被调用,因此它知道它花费的时间太长,但它实际上并没有取消它,它只是继续执行,直到任务完成

我肯定这很简单,我做错了,但我看不出来

提前谢谢。
Andy

如果
Test1
Test2
不是为支持取消而编写的,那么您运气不好-取消是合作的-正在运行的代码必须意识到这一点。您的
ThrowIfCancellationRequested
行不可访问,因为它们位于
Return
语句之后。因此,我是否需要将cts传递到我的Test1和Test2函数,并在其中检查cts.IsCancellationRequested?您不一定要传递
cts
,但可能需要传递它生成的令牌(如果您将
CancellationTokenSource
传递给周围的人,那么任何人都可以使用它请求取消-而通常情况下,您希望您的外部代码具有该级别的控制,但其他一切都能够对令牌作出反应)。