Chronometras gali nustoti laukti, nors HTTP užklausa tebevyksta. Kai proxy bandymui numatytas biudžetas, atšaukimą perduokite pačiai operacijai.

Modernioje .NET programoje, kurioje jau yra proxy sukonfigūruotas HttpClient:

using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(5));
using var response = await client.GetAsync(
    targetUrl,
    HttpCompletionOption.ResponseHeadersRead,
    budget.Token);
response.EnsureSuccessStatusCode();
string body = await response.Content.ReadAsStringAsync(budget.Token);

Tas pats biudžetas pradedamas prieš paruošimą ir galioja skaitant turinį. ResponseHeadersRead grąžina valdymą po antraščių, todėl HttpClient baigties laikas pats savaime neapibrėžia vėlesnio turinio skaitymo biudžeto.

Atšaukimą atskirkite nuo HTTP būsenos ir transporto klaidų. OperationCanceledException gali kilti dėl perduoto žetono ar kito sukonfigūruoto laiko; patikrinkite atitinkamą atšaukimo šaltinį, o ne kiekvieną klaidą vadinkite mirusiu proxy.

Naudokite tą patį klientą, kuriam priklauso šis proxy maršrutas. Bandymo atšaukimas nereiškia, kad kiekvienai vėlesnei užklausai reikia atstatyti visą ryšių telkinį.

Pavyzdyje kaupiamas baigtinio dydžio atsakymo turinys. Srautu atsisiunčiant, žetoną reikia perduoti srauto kopijavimo ciklui ir atsakymą atlaisvinti kiekviename išėjimo kelyje.

Atšaukimas išreiškia operacijos politiką, o ne tikslią faktinio laiko garantiją kiekvienam platformos veiksmui. Nekeiskite jo begaline Task.IsCompleted tikrinimo kilpa.

Susiję straipsniai