如何處理 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
用來取得 CancellationToken
和 ParseResult 物件。 ParseResult
可以提供引數或選項值。
若要測試範例程式碼,請使用需要一些時間才能載入的 URL 執行命令,在載入完成之前,請按 Ctrl+C。 在macOS上,按 Command+Period(.)。 例如:
testapp --url https://learn.microsoft.com/aspnet/core/fundamentals/minimal-apis
The operation was aborted
您也可以使用 CancellationToken.Register 方法直接新增取消動作。
如需設定流程結束代碼替代方式的詳細資訊,請參閱設定結束代碼。