Anulowanie, jeśli odpytywanie tokenu anulowania nie jest możliwe

Oto (głupi) przykład metody, która blokuje wątek dzwoniącego, ale nie obsługuje anulowania:

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

W najgorszym przypadku powrót tej metody zajmuje 17 godzin. Udawaj, że nie mam dostępu do kodu źródłowego tej metody.Jak zawinąć wywołanie w metodzie, która pobiera symbol CancellationToken?

Celem jest pozwolićWorkUntil5() biegać do momentu anulowania rezerwacji. W tym momencie połączenie powinno zostać zakończone przy użyciu dowolnych środków.

Oto najlepszy sposób, w jaki mogłem się wymyślić. Używa zadań, ale nadal blokuje wątek dzwoniącego. Coś w tym nie pasuje. Myśląc, że powinien być lepszy sposób dzwonieniamres.Set() po powrocie pierwszego połączenia.

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