処理の打ち切りは CancellationToken で下流まで伝えるのが定石。タイムアウトも「一定時間後に Cancel」として同じ経路に乗せると扱いやすい。
CancellationTokenSource.CancelAfter か CreateLinkedTokenSource で時間切れを表現OperationCanceledException / TaskCanceledExceptionusing var cts = CancellationTokenSource.CreateLinkedTokenSource(ct);
cts.CancelAfter(TimeSpan.FromSeconds(10));
await DoWorkAsync(cts.Token);
// または
using var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
await http.GetAsync(url, timeoutCts.Token);
関連: HttpClient タイムアウト / async/await デッドロック