Proporcionar cancelación si no es posible realizar un sondeo de CanceToken

Aquí hay un ejemplo (tonto) de un método que bloquea el hilo de la persona que llama pero no admite la cancelación:

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

En el peor de los casos, llamar a este método tarda 17 horas en volver. Haga de cuenta que no tengo acceso al código fuente de este método.¿Cómo encierro la llamada en un método que toma un CancelToken?

El objetivo es dejarWorkUntil5() correr hasta que se solicite la cancelación. En ese punto, la llamada debe terminarse por cualquier medio posible.

Aquí está la mejor manera en que podría llegar a mí mismo. Utiliza tareas, pero aún bloquea el hilo de la persona que llama. Algo sobre eso no se siente bien. Pensando que debería haber una mejor manera de llamarmres.Set() Una vez que vuelve la primera llamada.

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta