De la tâche.FromResult() par rapport à la Tâche.Run()
J'ai rencontré pas mal de situations dernièrement où async
méthodes pour exécuter de manière synchrone, mais le retour d'une Tâche de toute façon, de sorte qu'ils peuvent être attendue, par exemple
public virtual Task CreateAsync(TUser user)
{
ThrowIfDisposed();
if (user == null) throw new ArgumentNullException("user");
Context.Save(user);
Context.Flush();
return Task.FromResult(0);
}
Sûrement, il est préférable de répartir la probablement-opération de longue durée à un fil et retour toujours actif tâche, pour véritablement être attendu:
public virtual Task CreateAsync(TUser user)
{
ThrowIfDisposed();
if (user == null) throw new ArgumentNullException("user");
return Task.Run(() =>
{
Context.Save(user);
Context.Flush();
});
}
J'ai des soupçons, cependant, que la filature hors de TPL de threads n'est pas la plus sûre. Tout commentaire sur ces deux modèles?
Lorsque cela est possible, il convient d'appeler une véritable méthode asynchrone, à la place de l'un de ces.
De quelle manière est le deuxième pas async (autres que de ne pas utiliser un nouveau mot-clé)? (venant de quelqu'un qui n'utilise pas async souvent)
- Il encore des déchets à un fil. Voir blog.slaks.net/2014-12-23/parallelism-async-threading-explained
blog.stephencleary.com/2013/11/... blog.stephencleary.com/2013/11/...
Ok, je reçois ce que vous dites. Mieux
De quelle manière est le deuxième pas async (autres que de ne pas utiliser un nouveau mot-clé)? (venant de quelqu'un qui n'utilise pas async souvent)
- Il encore des déchets à un fil. Voir blog.slaks.net/2014-12-23/parallelism-async-threading-explained
blog.stephencleary.com/2013/11/... blog.stephencleary.com/2013/11/...
Ok, je reçois ce que vous dites. Mieux
await Context.Save(user)
et aller de là. Si nous supposons que le Contexte.Enregistrer est de la 3e partie et nous ne pouvons pas ajouter async là, quelles sont nos options? Il semble que des options dans le po, le premier qui bloque le thread courant est bien pire que la seconde, dont au moins shunts à un autre thread et permet au courant de continuer?OriginalL'auteur ProfK | 2015-11-30
Vous devez vous connecter pour publier un commentaire.
Si votre méthode est synchrone, vous ne devriez pas retourner un
Task
pour commencer. Il suffit de créer un traditionnel méthode synchrone.Si, pour une raison qui n'est pas possible (par exemple, vous mettre en œuvre certaines async interface) pour retourner un formulaire de tâche à l'aide de
Task.FromResult
ou encore mieux dans ce casTask.CompletedTask
(ajouté .NET 4.6) est beaucoup mieux que d'utiliserTask.Run
dans la mise en œuvre:Si la consommation de votre API se soucie fortement sur la
Task
méthode qui retourne pas en cours d'exécution synchrone ils peuvent utiliserTask.Run
eux-mêmes pour s'en assurer.Vous devriez garder à l'esprit que les méthodes asynchrones peuvent être considérables synchrone partie (la partie avant le premier attendent) même si elles ne sont finalement continuer de manière asynchrone. Vous ne pouvez pas assumer async méthodes retournent un
Task
immédiatement de toute façon.OriginalL'auteur i3arnon
Task.FromResult
n'est pas réellement crée ou exécute une tâche, mais il vient de encapsule le résultat dans un objet tâche. J'ai personnellement utilisé dansUnit Tests
où j'ai besoin de simuler laAsync
méthodes et bien sûr, je ne voudrais pas pour exécuter des tâches concrètes dans les tests Unitaires.Outre
Task.Run
va réellement créer une tâche et l'exécution d'une tâche sur TaskScheduler. Il n'est pas recommandé d'utiliserTask.Run
lorsque vous êtes en train de faireAsync
de programmation. Utilisez plutôtawait
sur les tâches. Voir quelques à faire et à ne pas de Tâches par Stephen Cleary.OriginalL'auteur vendettamit