Предоставление отмены, если опрос CancellationToken невозможен
Вот (глупый) пример метода, который блокирует поток вызывающего, но не поддерживает отмену:
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