Question

Pour autant que je sache, lorsque l'exécution se présente sur l'instruction en dessous, il enveloppe le reste de la fonction comme un rappel de la méthode qui est invoquée de manière asynchrone (someCall() dans cet exemple). Dans ce cas anotherCall() sera exécuté comme rappel pour someCall():

    await someCall();
    await anotherCall();

Je me demande s'il est possible de faire des performances d'exécution comme ceci: appelez someCall() À la mode asynchronisée et revenez immédiatement au fil d'appel, puis invoquez anotherCall() De même (sans attendre someCall compléter). Parce que j'ai besoin de ces deux méthodes pour exécuter de manière asynchrone et supposons que ces appels ne sont que du feu et oublient les appels.

Est-il possible d'implémenter ce scénario en utilisant juste async et await (Ne pas utiliser d'ancien begin/end mécanisme)?

Était-ce utile?

La solution

L'async / attente comprend quelques opérateurs pour aider à la composition parallèle, comme WhenAll et WhenAny.

var taskA = someCall(); // Note: no await
var taskB = anotherCall(); // Note: no await

// Wait for both tasks to complete.
await Task.WhenAll(taskA, taskB);

// Retrieve the results.
var resultA = taskA.Result;
var resultB = taskB.Result;

Autres conseils

Le moyen le plus simple est probablement de faire cela:

var taskA = someCall();
var taskB = someOtherCall();
await taskA;
await taskB;

C'est particulièrement sympa si vous voulez les valeurs du résultat:

var result = await taskA + await taskB;

Alors tu n'as pas besoin de faire taskA.Result.

TaskEx.WhenAll pourrait être plus rapide que deux attentes après l'autre. Je ne sais pas car je n'ai pas fait une enquête sur les performances à ce sujet, mais à moins que vous ne voyiez un problème, je pense que les deux attentes consécutifs se lisent mieux, surtout si vous avez les valeurs du résultat.

Le CTP asynchronisé n'est plus nécessaire à condition que vous utilisiez .NET 4.5. Notez que la fonctionnalité asynchrone est implémentée par le compilateur afin que les applications .NET 4 puissent l'utiliser mais VS2012 est nécessaire pour le compiler.

Taskex n'est plus nécessaire. Le CTP n'a pas pu modifier le cadre existant, il a donc utilisé des extensions pour accomplir des choses que le langage gérerait en 5.0. Utilisez simplement la tâche directement.

Alors ici, j'ai réécrit le code (répondu par Stephen Cleary) en remplaçant Taskex par la tâche.

var taskA = someCall(); // Note: no await
var taskB = anotherCall(); // Note: no await

// Wait for both tasks to complete.
await Task.WhenAll(taskA, taskB);

// Retrieve the results.
var resultA = taskA.Result;
var resultB = taskB.Result;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top