web-dev-qa-db-fra.com

Dois-je toujours ajouter CancellationToken à mes actions de contrôleur?

Est-ce une bonne pratique de toujours ajouter CancellationToken dans mes actions, que l'opération soit longue ou non?

Je l'ajoute actuellement à chaque action et je ne sais pas si c'est bien ou mal.

[ApiController]
[Route("api/[controller]")]
public class DummiesController : ControllerBase
{
    private readonly AppDbContext _dbContext;

    public DummyController(AppDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    [HttpGet("{id}")]
    public async Task<ActionResult<Dummy>> GetAsync(int id, CancellationToken ct) // <<----- should I always do this?
    {
        var dummy = await _dbContext.Dummies.AsNoTracking().SingleOrDefaultAsync(e=>e.Id == id, ct);
        if (dummy == null) return NotFound();
        return dummy;
    }
}

L'ajout de CancellationToken ct = default(CancellationToken) est-il également nécessaire?

16
Konrad

Il vaut la peine d'ajouter si vous avez une dépendance à l'égard d'une ressource externe.

Supposons que votre base de données soit occupée ou que vous ayez en place des stratégies de gestion des erreurs/nouvelles tentatives pour votre connexion à la base de données. Si un utilisateur final appuie sur stop dans son navigateur, le jeton d'annulation aidera toutes les opérations en attente (dans votre code) à annuler correctement.

Pensez moins à la nature à long terme dans des circonstances normales, mais à la nature à long terme dans des circonstances moins qu'idéales, par ex. si elle s'exécute dans Azure et que votre base de données SQL fait l'objet d'une maintenance de routine et que le cadre d'entité est configuré pour réessayer (en supposant que le cadre d'entité répond de manière sensible aux jetons d'annulation).

En guise de remarque: le cadre de résilience Polly a un excellent support pour les jetons d'annulation externes pour coordonner les annulations de nouvelle tentative à partir d'une annulation externe. Leur wiki vaut la peine d'être lu car c'est une excellente révélation pour coordonner l'annulation: https://github.com/App-vNext/Polly/wiki

En ce qui concerne CancellationToken ct = default(CancellationToken), cela vaut probablement plus pour le code de bibliothèque que pour une action Controller. Mais pratique si vous testez directement votre contrôleur mais que vous ne voulez pas passer un jeton d'annulation. Cela dit, le noyau .net WebHostBuilder testframework est plus facile à tester que de tester directement les actions du contrôleur de nos jours.

10
Alex KeySmith

Dois-je toujours ajouter CancellationToken à mes actions de contrôleur?

Non. Vous ne devriez pas toujours.

Utilisation de CancellationTokens dans les contrôleurs ASP.NET Core MVC
https://andrewlock.net/using-cancellationtokens-in-asp-net-core-mvc-controllers/

Le comportement correct dépendra de votre application. Si la demande modifie l'état, il se peut que vous ne souhaitiez pas interrompre l'exécution à mi-chemin d'une méthode . D'un autre côté, si la demande n'a pas d'effets secondaires, vous voudrez probablement arrêter l'action (probablement coûteuse) dès que vous le pouvez.

Donc, si vous avez une méthode/action comme ci-dessous (simplifiée);

await ProcessOrder();
await UpdateInventory();

Vous ne souhaitez pas annuler la commande en cours de traitement, si c'est le cas, la commande peut être terminée, mais vous ne mettrez pas à jour l'inventaire si l'utilisateur traverse le tunnel et perd la connexion Internet.

Ceci est particulièrement important lorsque les opérations ne peuvent pas être incluses dans un modèle de type unité de travail (par exemple, un système distribué) et que l'on devrait essayer de minimiser les annulations.

9
Teoman shipahi