Обработка завершения в 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 метода.
Сведения о альтернативном способе задания кода выхода процесса см. в разделе "Настройка кодов выхода".