Biorąc pod uwagę następujący kod:Anulowanie żądania HttpClient - Dlaczego TaskCanceledException.CancellationToken.IsCancellationRequested false?
var cts = new CancellationTokenSource();
try
{
// get a "hot" task
var task = new HttpClient().GetAsync("http://www.google.com", cts.Token);
// request cancellation
cts.Cancel();
await task;
// pass:
Assert.Fail("expected TaskCanceledException to be thrown");
}
catch (TaskCanceledException ex)
{
// pass:
Assert.IsTrue(cts.Token.IsCancellationRequested,
"expected cancellation requested on original token");
// fail:
Assert.IsTrue(ex.CancellationToken.IsCancellationRequested,
"expected cancellation requested on token attached to exception");
}
spodziewałbym ex.CancellationToken.IsCancellationRequested
być true
wewnątrz bloku catch, ale tak nie jest. Czy coś nie rozumiem?
Czy instancja "ex.CancelationToken" jest równa (ReferenceEqual) dla cts? Dokumentacja stwierdza: "Jeśli token jest powiązany z anulowaną operacją, właściwość tokenu" CancellationToken.IsCancellationRequested "zwraca" true ". – Alex
@Alex: 'CancellationToken' jest strukturą, więc' ReferenceEquals() 'zawsze zwróci false. –
@PeterDuniho twój komentarz sugeruje, że 'object.ReferenceEquals' zwróci' false' dla sprawdzenia structs. Czy implikowałeś to, czy też miałeś na myśli, że logicznie musi to być "fałsz", ponieważ wyniki "IsCancellationRequested" różnią się? –