2013-03-19 2 views
3

Каковы наилучшие методы поддержки как синхронных, так и асинхронных версий метода?Поддерживать как синхронные, так и асинхронные реализации

Let's suppose we have the following method: 
public ImportData Import(ZipFile zipFile) 
{ 
    ... //Step 1. Initialization 
    var extractedZipContent = zipFile.Extract(); //Step 2 
    ... //Step 3. Some intermediate stuff 
    var parsedData = ParseExtractedZipContent(extractedZipContent); //Step 4 
    ... //Step 5. Some code afterwards 
} 

Шаг 2 и 4 затянувшийся поэтому мы хотим, чтобы называть их асинхронно в асинхронной версии метода импорта:

public async Task<ImportData> ImportAsync(ZipFile zipFile) 
{ 
    ... //Step 1. Initialization 
    var extractedZipContent = await zipFile.Extract(); //Step 2 
    ... //Step 3. Some intermediate stuff 
    var parsedData = await ParseExtractedZipContentAsync(extractedZipContent); //Step 4 
    ... //Step 5. Some code afterwards 
} 

Теперь у нас есть как синхронные и асинхронные реализации. Но у нас также есть дублирование кода. Как мы можем избавиться от него?

Мы можем извлечь шаги 1, 3 и 5 и вызвать их из обеих реализаций. Но 1. мы по-прежнему дублируем порядок вызова методов 2. Это не так просто на реальном коде

Лучшая идея, к которой я пришел, - иметь асинхронную реализацию. И синхронная реализация просто подождала завершения асинхронной реализации:

public ImportData Import(ZipFile zipFile) 
{ 
    var importAsyncTask = ImportAsync(zipFile); 
    importAsyncTask.Wait(); 
    return importAsyncTask.Result; 
} 

Но я не уверен в этом решении. Есть ли какие-либо наилучшие практики в отношении этой проблемы?

ответ

4

Как мы можем избавиться от него?

Вы не можете.

У Стивена Туба есть отличные сообщения в блоге, объясняющие подводные камни synchronous wrappers for asynchronous methods и asynchronous wrappers for synchronous methods. Короткий ответ: не надо.

Ваш лучший выбор - поддерживать и то, и другое. Через несколько лет синхронные методы можно считать устаревшими.

См. Также this question.

+0

+1 Интересная информация Стивен. Не видели вас на форумах. Приятно видеть вас активным. –