4

3 つのステップで完了し、完了する前に部分的な結果を返す非同期操作を使用しています。awaitもともとはイベントを使用して進行状況を通知していましたが、可能な操作 (またはそれらのチェーン)として適切にラップしたいと考えています。

正確には、Windows Phone 7 の PhotoCamera.CaptureImage メソッドであり、次の順序でイベントを発生させます (関連する結果の種類を使用)。

  1. CaptureStarted、私にはそれほど興味深いものではありません
  2. CaptureThumbnailAvailable(ストリーム)
  3. CaptureImageAvailable(ストリーム)
  4. CaptureCompleted(ブール値)

これどうやって包むの?現在、私は を使用してTaskCompletionSourceを呼び出しSetResultていCaptureCompletedます。サムネイルと画像が利用可能になる手順 2 と 3 については説明しません。代わりにコールバックを使用することにしました。

私の拡張方法(簡潔にするためにコードを省略):

public static Task<bool> CaptureImageAsync(this PhotoCamera photoCamera,
                                           Action<Stream> thumbnailAvailableCallback,
                                           Action<Stream> imageAvailableCallback)

タスクとコールバックが混在しているため、これは完全にクリーンではありません。私は知っていIProgress<T>ます。ただし、進行状況の値は均一な型 (Stream、Stream、bool) ではありません...そして、IProgress<T>パターンが伸びすぎませんか?

Task<T>順番に待機している複数を使用することはオプションですが、それは、何らかの方法で強制する必要がある特定の順序を想定しています。おそらく、各タスクの結果には、メンバーとして「次の」タスクが含まれる可能性があります。

ThumbnailResult thumbnailResult = await photoCamera.CaptureImageAsync();
...
ImageResult imageResult = await thumbnailResult.NextTask;
...
bool finalResult = await imageResult.NextTask;

私はまだここでやや的外れだと思っています。アイデア?

4

1 に答える 1

2

個人的には、3 つのメソッドを返すクラスを作成しますTask<T>。呼び出し元は、3 つのメソッドを任意の順序で呼び出すことができ、常に機能します。ifGetFinalResultAsyncが最初に呼び出された後GetThumbnailAsync、唯一Task<T>の結果は、await が使用されたときに 2 番目が結果を取得し、同期的に返されることです。

var photoCapture = photoCamera.BeginCapture();

var thumbnailResult = await photoCapture.GetThumbnailAsync();
var imageResult = await photoCapture.GetImageAsync();
var finalResult = await photoCapture.GetFinalResultAsync();

すべてを待つには:

var thumbnailTask = photoCapture.GetThumbnailAsync();
var imageTask = photoCapture.GetImageAsync();
var finalTask = photoCapture.GetFinalResultAsync();

await Task.WhenAll(thumbnailTask, imageTask, finalTask);
DoWork(thumbnailTask.Result, imageTask.Result, finalTask.Result);
于 2011-12-02T20:59:46.663 に答える