4

维护该方法的同步和异步版本的最佳实践是什么?

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 步需要长时间运行,因此我们希望在 Import 方法的异步版本中异步调用它们:

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

1 回答 1

5

我们怎样才能摆脱它?

你不能。

Stephen Toub 有一些优秀的博客文章解释了异步方法的同步包装器同步方法的异步包装器的缺陷。简短的回答是:不要。

你最好的选择是暂时保持两者。几年后,同步方法可以被认为是过时的。

另请参阅此问题

于 2013-03-19T18:29:16.537 回答