다음을 통해 공유


System.CommandLine에서 종료를 처리하는 방법

Important

System.CommandLine는 현재 미리 보기로 제공되며 이 설명서는 버전 2.0 베타 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+마침표(.)를 누릅니다. 예시:

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

취소 작업은 CancellationToken.Register 메서드를 사용하여 직접 추가할 수도 있습니다.

프로세스 종료 코드를 설정하는 다른 방법에 대한 자세한 내용은 종료 코드 설정을 참조하세요.

참고 항목

System.CommandLine 개요