Je suis nouveau pour async / attendre le modèle C # et essayer de comprendre si ces deux options sont essentiellement la même chose: et cette p> Je pense que la 1ère reprise utilisera un fil supplémentaire de la piscine ... et cela enveloppe également une tâche supplémentaire. Ou je me trompe? P> p>
3 Réponses :
la plupart em> de l'époque, faire des travaux asynchrones dans Tâche.Run CODE> Faire la queue son délégué à la piscine de thread. Cela provoque deux choses importantes: p>
dostuff code> avant le premier
attendre code> exécuter sur un thread de piscine de thread, au lieu de sur le thread d'appel . Li>
dostuff code> sera exécuté dans un contexte de piscine de thread, au lieu de Utilisation du contexte actuel du fil d'appel . Li>
ol>
Task.Run code> est une erreur. Mais il est parfois utile, disons si
dostuff code> est un travail de calcul lourd avant qu'il agit de manière asynchrone, alors
tâche.run code> pourrait être utilisé pour déplacer ce travail d'un fil d'interface utilisateur. p>
Le nom de la méthode transmet la raison pour laquelle il est fait comme ça, "longroin". Vous pouvez passer un drapeau de création Même votre deuxième exemple n'est pas complètement correct, en fonction des circonstances. S'il s'agit d'une bibliothèque, alors il devrait vraiment être longRunning code> à
Tâche.run () code> (que cet échantillon ne fonctionne pas) et en tant que fil de mise en oeuvre pure, l'exécution allouera un fil séparé pour cela . p>
attendre dostuff (). ConfigureaWait (Faux); Code>. P>
Ils sont très similaires em>, mais il y a une chance que Les deux options peuvent être souhaitables, dans différents scénarios! P> Cependant, il existe une troisième option, qui exprime exactement em> l'intention de "exécuter le reste ailleurs" dostuff code> puisse compléter de manière synchrone; Si cela se produit, votre deuxième (
attendre code> uniquement) bloquerait la longueur de longue durée qui prend ce qui prend, où, à mesure que la première (
tâche.run.run code>) retournerait toujours incomplète à l'appelant (déroulant leur pile et la planification d'une continuation), et faire fonctionner le travail de blocage sur le fil de la piscine.
synccontext code>: p>
public async Task LongRunningMethod()
{
await Task.Yield();
await DoStuff(); // possibly with .ConfigureAwait(false)
}
Vous devriez appeler vous-même le dieu de system.threading.tasks.task code>.
@Tanveerbadar céder avant moi!
Si LongRunningMethod est appelé sur le fil de l'interface graphique, Dostuff fonctionnera également sur le fil de l'interface graphique, pas dans la piscine de fil. Vous aurez besoin d'un configureawait pour l'obtenir dans la piscine.
@San oui, vous avez raison - s'il y a un contexte de synchronisation, cela ira retour i> dans le contexte de synchronisation; Je vais réfléchir à cela (je suis tellement habitué à vivre dans un monde sans synchronisation-contexte; je ne les manques pas!)
Pourquoi préférer attendre la tâche.yield code> sur
attendre la tâche.run (async () => code>? Est-ce plus efficace? Ou juste parce que c'est plus expressif (en supposant que c'est)
@Theodorzoulias surtout sur l'expression de l'intention, même si je crois que cela se rase quelques morceaux - mais pas assez pour la matière dans des scénarios réalistes (si vous utilisez rendez-vous code> autant, vous ne suffisez probablement pas assez lot )
Connexes: attendre la tâche.Run vs attendre c #