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 に答える