Fornecendo cancelamento se o polling CancellationToken não for possível

Aqui está um exemplo (bobo) de um método que bloqueia o thread do chamador, mas não suporta o cancelamento:

Public Sub WorkUntil5()
    Threading.SpinWait.SpinUntil(Function() Now.Hour >= 17)
End Sub

Na pior das hipóteses, chamar esse método leva 17 horas para retornar. Finja que não tenho acesso ao código-fonte desse método.Como faço para quebrar a chamada em um método que leva um CancellationToken?

O objetivo é deixarWorkUntil5() executar até que o cancelamento seja solicitado. Nesse ponto, a chamada deve ser encerrada usando todos os meios possíveis.

Aqui está a melhor maneira que eu poderia chegar a mim mesmo. Ele usa tarefas, mas ainda bloqueia o encadeamento do chamador. Algo sobre isso não parece certo. Pensando que deveria haver uma maneira melhor de ligarmres.Set() quando a primeira chamada retornar.

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

questionAnswers(1)

yourAnswerToTheQuestion