0

次の非同期コードがあります。

public async Task<List<PreprocessingTaskResult>> Preprocess(Action onPreprocessingTaskFinished)
{
  var preprocessingTasks = BuildPreprocessingTasks();

  var preprocessingTaskResults = new List<PreprocessingTaskResult>();

  while (preprocessingTasks.Count > 0)
  {
    //Wait till at least one task is completed
     await TaskEx.WhenAny(preprocessingTasks.ToArray());

     onPreprocessingTaskFinished();
  }

  return 
}

そして、非同期使用コード

var preprocessingTaskResults = await Preprocess(someAction);

場合によっては、同期的に呼び出す必要があります。より単純なケース(非同期メソッドがタスクのみを返す場合)の場合、私は次のことを行っていました。

var someTask = AsyncMethod();
Task.Wait(someTask);

しかし、ここでそれをどのように実装すべきか混乱しています。

4

2 に答える 2

1

非同期コードを同期的に呼び出す簡単な方法はありません。Stephen Toub はここでいくつかのさまざまなアプローチについて説明していますが、すべての状況で機能するアプローチはありません。

最善の解決策は、同期呼び出しコードを非同期に変更することです。Xamarinの出現Microsoft.Bcl.Asyncと最近のリリースにより、.NET 4.0 (およびそれ以降)、Windows Phone 7.1 (およびそれ以降)、Windows Store、Silverlight 4 (およびそれ以降)、iOS/MonoTouch、Android/MonoDroid、これらのプラットフォームの任意の組み合わせに対応するポータブル クラス ライブラリ。

したがって、最近使用しない理由はほとんどありませんasync

しかし、どうしても同期 API が必要な場合は、すべてを同期にするのが最善の解決策です。非同期 API と同期 API の両方が必要な場合は、残念ながらコードの重複が発生しますが、現時点ではこれが最適なソリューションです。

于 2013-11-15T13:32:41.840 に答える