这是一个阻塞调用者线程但不支持取消的方法的(愚蠢的)示例:
Public Sub WorkUntil5()
Threading.SpinWait.SpinUntil(Function() Now.Hour >= 17)
End Sub
在最坏的情况下,调用此方法需要 17 小时才能返回。假装我无权访问此方法的源代码。如何将调用包装在采用 CancellationToken 的方法中?
目标是让WorkUntil5()
运行直到请求取消。此时应使用任何可能的方式终止呼叫。
这是我自己想出的最好方法。它使用任务,但它仍然阻塞调用者的线程。感觉有些不对劲。mres.Set()
认为一旦第一个呼叫返回,应该有更好的呼叫方式。
Public Sub WorkUntilYouGetBored(cancellationToken As Threading.CancellationToken)
Dim mres As New Threading.ManualResetEventSlim
Using cancellationToken.Register(Sub() mres.Set())
Dim t = Task.Factory.StartNew(Sub() WorkUntil5())
t.ContinueWith(Sub() mres.Set())
mres.Wait()
End Using
If cancellationToken.IsCancellationRequested Then
Console.WriteLine("You went home early.")
Else
Console.WriteLine("It's time to go home.")
End If
End Sub