C #имеют асинхронную функцию вызова синхронной функции или синхронную функцию вызова асинхронной функции

Я пишу библиотеку C #.Net 4.5 для выполнения общих операций с базой данных sql (резервного копирования, восстановления, выполнения скрипта и т. д. ). Я хочу иметь как синхронные, так и асинхронные функции для каждой операции, так как эта библиотека будет использоваться как консольными, так и графическими приложениями, но я не хочу везде дублировать код. Так что, как я вижу, у меня есть два варианта:

  1. Напишите код, который выполняет работу в синхронной функции, а затем просто оберните его задачей для асинхронной функции, например:

    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. Напишите код, который выполняет работу в асинхронной функции, и вызовите его из синхронной функции, используя.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.  
    }
    

. Один вариант лучше другого? Является ли это лучшей практикой? Или есть другие (лучшие )альтернативы?

Я знаю, что одно предостережение относительно использования.Wait ()заключается в том, что все операторы await в асинхронной функции должны использовать.ConfigureAwait (false ), чтобы избежать взаимоблокировок (. как обсуждалось здесь), но поскольку я пишу библиотеку, которой никогда не потребуется доступ к пользовательскому интерфейсу или веб-контексту, я могу это сделать.

Я также отмечу, что в библиотеке SQL обычно также есть как синхронные, так и асинхронные функции, которые можно использовать, поэтому, если я выполняю работу в функции синхронизации, я бы вызывал их функцию синхронизации, а если выполняю работу в асинхронной функции, я вызовет их асинхронную функцию.

Мысли/предложения приветствуются.

--изменить :Я также разместил этот вопрос на форумах MSDN здесь , чтобы попытаться получить официальный ответ MS--

16
задан Community 23 May 2017 в 12:25
поделиться