Come gestire la terminazione in System.CommandLine
Importante
System.CommandLine
è attualmente disponibile in ANTEPRIMA e questa documentazione è per la versione 2.0 beta 4.
Alcune informazioni riguardano il prodotto in versione non definitiva che potrebbe essere modificato in modo sostanziale prima del rilascio. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Per gestire la terminazione, inserire un'istanza CancellationToken nel codice del gestore. Questo token può quindi essere passato alle API asincrone chiamate dall'interno del gestore, come illustrato nell'esempio seguente:
static async Task<int> Main(string[] args)
{
int returnCode = 0;
var urlOption = new Option<string>("--url", "A URL.");
var rootCommand = new RootCommand("Handle termination example");
rootCommand.Add(urlOption);
rootCommand.SetHandler(async (context) =>
{
string? urlOptionValue = context.ParseResult.GetValueForOption(urlOption);
var token = context.GetCancellationToken();
returnCode = await DoRootCommand(urlOptionValue, token);
});
await rootCommand.InvokeAsync(args);
return returnCode;
}
public static async Task<int> DoRootCommand(
string? urlOptionValue, CancellationToken cancellationToken)
{
try
{
using (var httpClient = new HttpClient())
{
await httpClient.GetAsync(urlOptionValue, cancellationToken);
}
return 0;
}
catch (OperationCanceledException)
{
Console.Error.WriteLine("The operation was aborted");
return 1;
}
}
Il codice precedente usa un overload SetHandler
che ottiene un'istanza InvocationContext anziché uno o più oggetti IValueDescriptor<T>
. InvocationContext
viene usato per ottenere gli oggetti CancellationToken
e ParseResult. ParseResult
può fornire valori di argomento o di opzione.
Per testare il codice di esempio, eseguire il comando con un URL che richiederà qualche istante per caricare e, prima che termini il caricamento, premere Ctrl+C. Su macOS premere Comando+Punto(.). Ad esempio:
testapp --url https://learn.microsoft.com/aspnet/core/fundamentals/minimal-apis
The operation was aborted
È possibile anche aggiungere azioni di cancellazione direttamente usando il metodo CancellationToken.Register.
Per informazioni su un modo alternativo per impostare il codice di uscita del processo, vedere Impostare i codici di uscita.