Compartilhar via


Como manipular a terminação em System.CommandLine

Importante

Atualmente, System.CommandLine está em VERSÃO PRÉVIA, e essa documentação é para a versão 2.0 beta 4. Algumas informações estão relacionadas a produtos de pré-lançamento que poderão ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.

Para manipular a terminação, insira uma instância CancellationToken no código do manipulador. Esse token poderá ser passado para APIs assíncronas que você chamar de dentro do manipulador, conforme mostrado no exemplo a seguir:

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

O código anterior usa uma sobrecarga SetHandler que obtém uma instância InvocationContext em vez de um ou mais objetos IValueDescriptor<T>. O InvocationContext é usado para obter os objetos CancellationToken e ParseResult. ParseResult pode fornecer valores de argumento ou opção.

Para testar o código de exemplo, execute o comando com uma URL que levará um momento para ser carregada e, antes de concluir o carregamento, pressione Ctrl+C. No macOS, pressione Command+Period(.). Por exemplo:

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

As ações de cancelamento também poderão ser adicionadas diretamente usando o método CancellationToken.Register.

Para obter mais informações sobre uma forma alternativa de definir o código de saída do processo, consulte Definir códigos de saída.

Confira também

System.CommandLine overview