Vornehmen der Beendigung in System.CommandLine

Wichtig

System.CommandLine befindet sich derzeit in der VORSCHAU, und diese Dokumentation gilt für Version 2.0 Beta 4. Einige Informationen beziehen sich auf Vorabversionen des Produkts, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.

Um die Beendigung vorzunehmen, müssen Sie eine CancellationToken-Instanz in Ihren Handlercode einfügen. Dieses Token kann dann an asynchrone API übergeben werden, die Sie in Ihrem Handler aufrufen, wie im folgenden Beispiel gezeigt:

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

Der vorangehende Code verwendet eine SetHandler-Überladung, die eine InvocationContext-Instanz anstelle eines oder mehrerer IValueDescriptor<T>-Objekte abruft. Wird InvocationContext verwendet, um die CancellationToken- und ParseResult-Objekte abzurufen. ParseResult kann Argument- oder Optionswerte bereitstellen.

Um den Beispielcode zu testen, führen Sie den Befehl mit einer URL aus, die etwas Zeit zum Laden braucht. Drücken Sie STRG+C, bevor der Ladevorgang abgeschlossen ist. Drücken Sie unter macOS Command+. (Punkt). Beispiel:

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

Abbruchaktionen können auch direkt mit der CancellationToken.Register-Methode hinzugefügt werden.

Informationen zu einer alternativen Möglichkeit zum Festlegen des Prozessausgangscodes finden Sie unter Festlegen von Exitcodes.

Weitere Informationen

System.CommandLine – Übersicht