Udostępnij za pośrednictwem


Jak obsługiwać zakończenie w programie System.CommandLine

Ważne

System.CommandLine jest obecnie dostępna w wersji zapoznawczej, a ta dokumentacja dotyczy wersji 2.0 beta 4. Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed jego wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.

Aby obsłużyć zakończenie, należy wstrzyknąć CancellationToken wystąpienie do kodu procedury obsługi. Ten token można następnie przekazać do asynchronicznych interfejsów API wywoływanych z poziomu programu obsługi, jak pokazano w poniższym przykładzie:

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

Powyższy kod używa SetHandler przeciążenia, które pobiera wystąpienie InvocationContext , a nie co najmniej jeden IValueDescriptor<T> obiekt. Element InvocationContext służy do pobierania CancellationToken obiektów i ParseResult . ParseResult może podać wartości argumentu lub opcji.

Aby przetestować przykładowy kod, uruchom polecenie z adresem URL, który potrwa chwilę, a przed zakończeniem ładowania naciśnij klawisze Ctrl+C. W systemie macOS naciśnij klawisz Command+Period(.). Na przykład:

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

Akcje anulowania można również dodać bezpośrednio przy użyciu CancellationToken.Register metody .

Aby uzyskać informacje na temat alternatywnego sposobu ustawiania kodu zakończenia procesu, zobacz Ustawianie kodów zakończenia.

Zobacz też

System.CommandLine Przegląd