Padrão de tempo limite no método assíncrono baseado em tarefa em C #

Até onde eu sei, existem dois padrões possíveis para implementar um tempo limite para métodos assíncronos baseados em tarefas:

Tempo limite incorporado
public Task DoStuffAsync(TimeSpan timeout)

Essa abordagem é mais difícil de implementar porque não é fácil implementar umglobal tempo limite para toda a pilha de chamadas. Por exemplo, um controlador de API da Web recebe uma solicitação HTTP e chamaDoStuffAsync, e o chamador deseja um tempo limite global de 3 segundos.

Ou seja, cada chamada de método assíncrono interno precisará receber a subtração do tempo já usado ...

Sem tempo limite incorporado
public Task DoStuffAsync(CancellationToken cancellationToken)

..........

CancellationTokenSource cancellationSource = new CancellationTokenSource();
Task timeoutTask = Task.Delay(3000);

if(await Task.WhenAny(DoStuffAsync(cancellationTokenSource), timeoutTask) == timeoutTask)
{
     cancellationSource.Cancel();

     throw new TimeoutException();
}

Esse parece ser o padrão mais confiável e fácil de implementar. O primeiro chamador define um tempo limite global e, setempos limite, todas as operações pendentes serão canceladas. Além disso, ele fornece um token de cancelamento para o chamador imediato e as chamadas internas compartilharão a mesma referência de token de cancelamento. Portanto, se o tempo limite do chamador exceder o limite, ele poderá cancelar qualquer thread de trabalho.

Toda a questão

Existe algum padrão que esteja faltando ou estou no caminho certo se desenvolver APIs usando o métodosem tempo limite incorporado?

questionAnswers(2)

yourAnswerToTheQuestion