Обработка завершения в System.CommandLine

Внимание

System.CommandLine в настоящее время находится в предварительной версии, и эта документация предназначена для версии 2.0 бета-версии 4. Некоторые сведения относятся к предварительному выпуску продукта, который может быть существенно изменен до его выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Чтобы обработать завершение, введите CancellationToken экземпляр в код обработчика. Затем этот маркер можно передать в асинхронные API, вызываемые из обработчика, как показано в следующем примере:

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

В предыдущем коде используется перегрузка SetHandler , которая получает экземпляр InvocationContext , а не один или несколько IValueDescriptor<T> объектов. Используется InvocationContext для получения CancellationToken объектов ParseResult. ParseResult может предоставлять значения аргументов или параметров.

Чтобы протестировать пример кода, выполните команду с URL-адресом, который займет некоторое время для загрузки, и до завершения загрузки нажмите клавиши CTRL+C. В macOS нажмите клавиши Command+Period(.). Например:

testapp --url https://video2.skills-academy.com/aspnet/core/fundamentals/minimal-apis
The operation was aborted

Действия отмены также можно добавлять непосредственно с помощью CancellationToken.Register метода.

Сведения о альтернативном способе задания кода выхода процесса см. в разделе "Настройка кодов выхода".

См. также

Обзор System.CommandLine