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