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