Я пишу библиотеку C #.Net 4.5 для выполнения общих операций с базой данных sql (резервного копирования, восстановления, выполнения скрипта и т. д. ). Я хочу иметь как синхронные, так и асинхронные функции для каждой операции, так как эта библиотека будет использоваться как консольными, так и графическими приложениями, но я не хочу везде дублировать код. Так что, как я вижу, у меня есть два варианта:
Напишите код, который выполняет работу в синхронной функции, а затем просто оберните его задачей для асинхронной функции, например:
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);
}
Напишите код, который выполняет работу в асинхронной функции, и вызовите его из синхронной функции, используя.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--