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
我使用 .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