VB.Net CancellationToken 不取消任务

VB.Net CancellationToken does not cancel the Task

我使用 .Net Framework 4.8 在 VB.Net 中编写 SAP Gui 脚本。在某些时候,由于我无法控制的情况,SAP 将无响应,并且被调用的函数将永远完全阻止进一步执行。在这种情况下,我想安全地退出代码。

为了克服这个 SAP 函数调用完全阻塞执行的障碍,我的方法是创建一个新的 System.Threading.Task,在其中执行阻塞函数,并在给定的超时后取消操作。如果找到该元素,我也想知道。

出于这个原因,我主要通过阅读 docs.mycrosoft.com

创建了以下代码
Dim propablyBlockingFn = Function () 
  Dim found = False

  While not found
    'code that interacts with sap and will either set found to true or completly block execution
  End While

  Return found
End Function

Dim timeout = 5000 'ms
Dim t As Task(Of Boolean) = Task.Run(fn)
Dim cts As New CancellationTokenSource()
Dim token As CancellationToken = cts.Token

Dim taskRef = t.Wait(timeout, token)

If Not taskRef Then
    cts.Cancel()
End If

Dim exists = t.Result 'it will stuck here
t.Dispose()

但是,在我尝试读取函数的结果时,代码不会再执行,取消调用也没有任何效果。

有人知道吗?

阅读以下 answer 后,我找到了最后的解决方案。请记住,可能会发生副作用。但如果在这种情况下我不中止线程,情况会更糟。

Dim taskThread As Thread = Nothing
Dim propablyBlockingFn = Function () 
  taskThread = Thread.CurrentThread 'Get the Thread the Task is running in
  Dim found = False

  While not found
    'code that interacts with sap and will either set found to true or completly block execution
  End While

  Return found
End Function

Dim timeout = 5000 'ms
Dim t As Task(Of Boolean) = Task.Run(fn)

Dim taskRef = t.Wait(timeout)

If Not taskRef Then
    taskThread.Abort() 'Abort the Thread
End If

Dim exists = t.Result