Patrón de tiempo de espera en método asincrónico basado en tareas en C #

Hasta donde sé, hay dos patrones posibles para implementar un tiempo de espera para los métodos asincrónicos basados en tareas:

Tiempo de espera incorporado
public Task DoStuffAsync(TimeSpan timeout)

Este enfoque es más difícil de implementar porque no es fácil implementar unglobal tiempo de espera para toda la pila de llamadas. Por ejemplo, un controlador de API web recibe una solicitud HTTP y llamaDoStuffAsync, y la persona que llama quiere un tiempo de espera global de 3 segundos.

Es decir, cada llamada al método asíncrono interno deberá recibir la resta del tiempo ya utilizado ...

Sin tiempo de espera 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();
}

Este parece ser el patrón más confiable y fácil de implementar. La primera persona que llama define un tiempo de espera global, y sitiempos muertos, todas las operaciones pendientes serán canceladas. Además, proporciona un token de cancelación a la persona que llama inmediatamente y las llamadas internas compartirán la misma referencia de token de cancelación. Por lo tanto, si el llamador superior agota el tiempo de espera, podrá cancelar cualquier subproceso de trabajo.

Toda la pregunta

¿Hay algún patrón que me falta o estoy en el camino correcto si desarrollo API utilizando elsin tiempo de espera incorporado?

Respuestas a la pregunta(2)

Su respuesta a la pregunta