Каковы наилучшие методы поддержки как синхронных, так и асинхронных версий метода?Поддерживать как синхронные, так и асинхронные реализации
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;
}
Но я не уверен в этом решении. Есть ли какие-либо наилучшие практики в отношении этой проблемы?
+1 Интересная информация Стивен. Не видели вас на форумах. Приятно видеть вас активным. –