下面是阻塞调用者的线程,但不支持取消的方法的(傻)例如:
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