web-dev-qa-db-fra.com

Devrions-nous utiliser CancellationToken avec des contrôleurs MVC / Web API?

Il existe différents exemples de contrôleurs asynchrones. Certains d'entre eux utilisent CancellationToken dans la définition de méthode:

public async Task<ActionResult> ShowItem(int id, CancellationToken cancellationToken)
{
    await Database.GetItem(id, cancellationToken);
    ...

Mais d'autres exemples et même les projets ASP.NET par défaut pour VS2013 n'utilisent pas du tout CancellationToken et fonctionnent sans:

public async Task<ActionResult> ShowItem(int id)
{
    await Database.GetItem(id);
    ...

Ce n'est pas clair, si nous devons utiliser CancellationToken dans les contrôleurs ou non (et pourquoi).

43
user1224129

Vous devez l'utiliser. Pour l'instant, cela ne s'applique que si vous avez un AsyncTimeout , mais il est probable qu'une future version de MVC/WebAPI interprète le jeton comme "l'un ou l'autre timeout ou le client s'est déconnecté ".

41
Stephen Cleary

Vous pourriez utiliser ceci

public async Task<ActionResult> MyReallySlowReport(CancellationToken cancellationToken)
{
    CancellationToken disconnectedToken = Response.ClientDisconnectedToken;
    using (var source = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, disconnectedToken))
    {
        IEnumerable<ReportItem> items;
        using (ApplicationDbContext context = new ApplicationDbContext())
        {
            items = await context.ReportItems.ToArrayAsync(source.Token);
        }
        return View(items);
    }
}

tiré de ici .

7
Ram

Les utilisateurs peuvent annuler les demandes à votre application Web à tout moment, en appuyant sur le bouton d'arrêt ou de rechargement de votre navigateur. En règle générale, votre application continuera de générer une réponse de toute façon, même si Kestrel ne l'enverra pas à l'utilisateur. Si vous disposez d'une méthode d'action longue, vous souhaiterez peut-être détecter le moment où une demande est annulée et arrêter l'exécution.

Vous pouvez le faire en injectant un CancellationToken dans votre méthode d'action, qui sera automatiquement lié au jeton HttpContext.RequestAborted pour la demande. Vous pouvez vérifier ce jeton pour l'annulation comme d'habitude et le transmettre à toutes les méthodes asynchrones qui le prennent en charge. Si la demande est annulée, une OperationCanceledException ou TaskCanceledException sera levée.

Le lien ci-dessous explique ce scénario en détail.

https://andrewlock.net/using-cancellationtokens-in-asp-net-core-mvc-controllers/

1
NidhinSPradeep