See https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/master/AsyncGuidance.md. Go through with a fine tooth comb verifying all is adhered to, e.g.:
TaskCompletionSource management is correct wrt disposal etc
CancellationTokenSource.Cancel is called whereever relevant