C# ont async appel de fonction de fonction synchrone ou un appel de fonction synchrone asynchrone en fonction de

Je suis en train d'écrire un C# .Net 4.5 bibliothèque pour faire commun sql opérations de base de données (sauvegarde, restauration, exécuter le script, etc.). Je veux avoir à la fois synchrone et asynchrone des fonctions pour chaque opération, cette bibliothèque sera utilisé par la console et des applications à interface graphique, mais je ne veux pas de code dupliqué partout. Donc, comme je le vois, j'ai deux options:

  1. Écrire le code qui fait le travail dans une fonction synchrone, et puis il suffit de l'envelopper dans une tâche asynchrone en fonction, comme suit:
    public void BackupDB(string server, string db)  
    {  
        //Do all of the work and long running operation here  
    }
    
    public async Task BackupDBAsync(string server, string db)  
    {  
        await Task.Factory.StartNew(() => BackupDB(server, db)).ConfigureAwait(false);  
    }
  2. Écrire le code qui fait le travail dans une fonction d'asynchrone, et de l'appeler à partir d'une fonction synchrone à l'aide .Wait():
    public async Task BackupDBAsync(string server, string db)  
    {  
        //Do all of the work and long running operation here, asynchronously.  
    }
    
    public void BackupDB(string server, string db)  
    {  
        BackupDBAsync(server, db).Wait(); //Execution will wait here until async function finishes completely.  
    }

Est une option meilleure que l'autre? Est l'une des meilleures pratiques? Ou existe-il d'autres (mieux) les solutions de rechange?

Je sais qu'une mise en garde à l'aide .Wait() est que tous les attendent des instructions dans la fonction async .ConfigureAwait(faux) pour éviter les blocages (comme discuté ici), mais depuis que je suis en train d'écrire une bibliothèque qui n'auront jamais besoin d'accéder à l'INTERFACE utilisateur ou WebContext je suis sûre de le faire.

Je note aussi que le SQL bibliothèque sont généralement aussi a la fois synchrone et asynchrone des fonctions qui peuvent être utilisées, donc si vous faites le travail dans la fonction de synchronisation, je dirais que leur fonction de synchronisation, et si vous faites le travail dans la fonction async, je dirais que leur fonction async.

Idées/suggestions sont les bienvenues.

-- edit: j'ai aussi posté cette question sur les forums MSDN ici pour essayer et obtenir un fonctionnaire MS réponse --

Le nom est recommandé de disposer de méthodes asynchrones fin dans "Async". Autre que cela, aucune des deux options est la meilleure. Bien que, à l'aide de ConfigureAwait(faux) ne limite pas la façon dont votre api peut être utilisée...
Je suis généralement quelque chose qui est déjà écrit. Si ce que l'on ne prend pas en charge asynchrone à tous, alors je ferais votre exemple 1.

OriginalL'auteur deadlydog | 2012-07-26