共用方式為


如何處理 System.CommandLine 中的終止情形

重要

System.CommandLine 目前為預覽版,而此文件適用於版本 2.0 搶鮮版 (Beta) 4。 部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。

若要處理終止情形,請將 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 用來取得 CancellationTokenParseResult 物件。 ParseResult 可以提供引數或選項值。

若要測試範例程式碼,請使用需要一些時間才能載入的 URL 執行命令,在載入完成之前,請按 Ctrl+C。 在macOS上,按 Command+Period(.)。 例如:

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

您也可以使用 CancellationToken.Register 方法直接新增取消動作。

如需設定流程結束代碼替代方式的詳細資訊,請參閱設定結束代碼

另請參閱

System.CommandLine 概觀