Motif Timeout sur la tâche asynchrone basé sur la méthode en C#

Autant que je sache, il s'agit de deux modèles possibles pour mettre en œuvre un délai d'attente de tâche asynchrone basé sur des méthodes:

Intégré dans le délai

public Task DoStuffAsync(TimeSpan timeout)

Cette approche est plus difficile à mettre en œuvre car il n'est pas facile à mettre en œuvre un mondiale délai d'attente pour l'ensemble de la pile d'appel. Par exemple, une Web API contrôleur reçoit une requête HTTP et il appelle DoStuffAsync, et que l'appelant veut un délai global de 3 secondes.

Qui est, de chaque intérieur async appel de la méthode devra faire l'objet de la soustraction de déjà utilisé du temps...

Pas intégré dans le délai

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();
}

Ce qui semble être le plus fiable et le plus facile à mettre en œuvre le modèle. Le premier appelant définit un délai global, et si il sorties de temps, toutes les opérations en cours sera annulée. En outre, il fournit un jeton d'annulation de l'appelant immédiat et intérieure appels partagent le même jeton d'annulation de référence. Ainsi, si le haut de l'appelant sorties de temps, il sera en mesure d'annuler toute thread de travail.

L'ensemble de la question

Est-il un modèle que je suis absent ou, suis-je dans le droit chemin si je développe des Api à l'aide de la pas intégré dans le délai?

OriginalL'auteur Matías Fidemraizer | 2014-09-05