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 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