Passate la scadenza all'operazione che può annullare il lavoro di rete. Per un .NET HttpClient esistente configurato tramite proxy:

using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(20));
using var response = await client.GetAsync(uri, deadline.Token);

L'applicazione fornisce client e uri. Questo overload riceve il token di annullamento; un timeout attorno all'attesa del suo task limiterebbe solo l'attesa di quel chiamante. Anche il polling di un flag di completamento ha lo stesso problema: il chiamante può andarsene mentre socket e worker restano occupati.

L'annullamento segue l'implementazione del client e il percorso di pulizia. Non promette che ogni azione di livello inferiore si fermi su un'istruzione esatta. Lasciate che quel percorso termini e liberate le risorse possedute dall'operazione. Includete nel design la lettura del corpo controllata separatamente; per un'operazione .NET ResponseHeadersRead moderna, passate lo stesso token attraverso la lettura del corpo. Altri client forniscono le proprie interfacce di annullamento, interruzione e pulizia.

Un nuovo tentativo ha bisogno di un esito per il tentativo precedente. Conservate il suo identificatore e il proxy scelto, richiedete l'annullamento quando serve ed evitate di perdere il task avviando sostituti all'infinito. Altrimenti un endpoint lento può accumulare lavoro più in fretta di quanto l'applicazione lo rilasci.

L'esito remoto richiede una gestione separata. La destinazione potrebbe aver già ricevuto un invio quando avviene l'annullamento. Usate la politica di ripristino o di idempotenza dell'applicazione; fermare il lavoro locale non annulla un'azione remota.

Articoli correlati