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 incorporadopublic 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 incorporadopublic 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ãoExiste algum padrão que esteja faltando ou estou no caminho certo se desenvolver APIs usando o métodosem tempo limite incorporado?