Предоставление отмены, если опрос 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

Ответы на вопрос(1)

Ваш ответ на вопрос