web-dev-qa-db-fra.com

Où définir le rappel pour la méthode asynchrone basée sur les tâches

Après cette question , j'essaye d'implémenter une méthode asynchrone en utilisant le TPL, et j'essaye de suivre les directives TAP.

Je veux que ma méthode asynchrone effectue un rappel lorsqu'elle est terminée. Pour autant que je puisse voir, il y a trois façons de le faire.

1) Rappel manuel dans mon délégué de tâche

public Task DoWorkAsync(DoWorkCompletedCallback completedCallback)
{
    return Task.Factory.StartNew(
    { 
        //do work

        //call callback manually
        completedCallback();
    });
}

2) Attribuer un rappel à la tâche dans le délégué de tâche

public Task DoWorkAsync(DoWorkCompletedCallback completedCallback)
{
    return Task.Factory.StartNew(
    { 
        //do work
    }
    ).ContinueWith(completedCallback); //assign callback to Task
}

3) Attribuer le rappel à la tâche dans l'appelant

public Task DoWorkAsync()
{
    return Task.Factory.StartNew(
    { 
        //do work
    });
}

public void SomeClientCode()
{
    Task doingWork = DoWorkAsync();
    doingWork.ContinueWith(OnWorkCompleted);
}

Mon intuition est que 3 est plus correct, car il dissocie le rappel de la méthode, et signifie que le code client peut gérer la tâche comme bon lui semble (à l'aide de rappels, d'interrogation, etc.), ce qui semble être la raison d'être des tâches . Cependant, que se passe-t-il si DoWorkAsync () termine son travail avant que le code client ne raccorde son rappel?

Existe-t-il une manière généralement acceptée de le faire ou est-ce trop nouveau?

Y a-t-il un avantage à faire 2) sur 1)?

44
GazTheDestroyer

La voie généralement acceptée est 3.

Les utilisateurs de TPL savent généralement qu'ils peuvent continuer une tâche avec ContinueWith. 1 et 2 offrent la même fonctionnalité, mais avec une interface non standard; l'utilisateur doit comprendre ce que signifie le paramètre délégué et ce qu'il doit passer, par exemple s'ils ne veulent pas continuer - tout cela alors que la méthode renvoie toujours une tâche qui peut être poursuivie de la manière standard.

33
dtb