Я пишу библиотеку С#.Net 4.5 для выполнения общих операций с базами данных sql (резервное копирование, восстановление, выполнение script и т.д.). Я хочу иметь как синхронные, так и асинхронные функции для каждой операции, так как эта библиотека будет использоваться как консольными, так и графическими приложениями, но я не хочу дублировать код везде. Так что, как я вижу, у меня есть два варианта:
-
Напишите код, который выполняет работу в синхронной функции, а затем просто заверните его в задачу для функции async, например:
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() заключается в том, что все ожидания операторов async должны использовать .ConfigureAwait(false), чтобы избежать взаимоблокировок (как обсуждалось здесь), но поскольку я пишу библиотеку, которая никогда не будет нуждаться в доступе к пользовательскому интерфейсу или WebContext, я могу это сделать.
Я также отмечу, что библиотека SQL обычно также имеет как синхронные, так и асинхронные функции, которые можно использовать, поэтому, если вы выполняете работу в функции синхронизации, я бы назвал их функцию синхронизации и выполнил работу в async функции, я бы назвал их асинхронной функцией.
Мысли/предложения приветствуются.
- edit: Я также разместил этот вопрос на форумах MSDN здесь, чтобы попытаться получить официальный ответ MS -