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