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

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

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