Compartir a través de


Cómo controlar la terminación en System.CommandLine

Importante

System.CommandLine se encuentra actualmente en versión preliminar y esta documentación es para la versión 2.0 beta 4. Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.

Para controlar la terminación, inserte una instancia CancellationToken en el código del manipulador. Después, este token se puede pasar a las API asincrónicas a las que llama desde el controlador, como se muestra en el ejemplo siguiente:

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;
    }
}

El código anterior usa una sobrecarga SetHandler que obtiene una instancia de InvocationContext en lugar de uno o varios objetos IValueDescriptor<T>. InvocationContext se usa para obtener los objetos CancellationToken y ParseResult. ParseResult puede proporcionar valores de argumento u opción.

Para probar el código de ejemplo, ejecute el comando con una dirección URL que tardará un momento en cargarse y, antes de que termine de cargarse, presione Ctrl+C. En macOS, presione Comando+Punto(.). Por ejemplo:

testapp --url https://learn.microsoft.com/aspnet/core/fundamentals/minimal-apis
The operation was aborted

Las acciones de cancelación también se pueden agregar directamente mediante el método CancellationToken.Register.

Para obtener información sobre una manera alternativa de establecer el código de salida del proceso, consulte Establecer códigos de salida.

Vea también

Información general de System.CommandLine