4

3つの手順で完了する非同期操作を使用していますが、完了前に部分的な結果が返されます。もともとはイベントを使って進捗状況を知らせていましたので、私はそれをawaitできる操作(またはその連鎖)として適切にラップしたいと思います。複数のタスク<T>またはIProgress <T>を部分的に完了しましたか?

正確には、それは(該当する結果タイプを持つ)は、次の順序でイベントを発火のWindows Phone 7にPhotoCamera.CaptureImage方法です:

  1. CaptureStarted、私
  2. CaptureThumbnailAvailableにその面白くありません(ストリーム)
  3. CaptureImageAvailable
  4. (ストリーム)
  5. CaptureCompleted(BOOL)

これをラップするには?現在、私はTaskCompletionSourceを使用しており、CaptureCompletedSetResultを呼び出しています。 ではなく、の手順2と3を実行すると、サムネイルと画像が表示されます。代わりにコールバックを使うことにしました。

私の拡張メソッド(簡潔にするためのコードを除外):

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

これは、タスクとコールバックの混合物を完全にクリーンな感じはありません。私はIProgress<T>を知っています。しかし、進捗値は均一なタイプ(ストリーム、ストリーム、ブール)ではなく... IProgress<T>パターンが伸びすぎていませんか?

複数のTask<T>を順番に使用することはオプションですが、それは何らかの形で強制しなければならない特定の順序を想定しています。たぶん、各タスクの結果は、メンバーとして「次」のタスクを含めることができます:

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

は、私はまだ、私はここにやや的外れだと思います。アイデア?

答えて

2

個人的に私はTask<T>を返す3つのメソッドを使ってクラスを作成します。呼び出し元は3つのメソッドを任意の順序で呼び出すことができ、常に動作します。 GetFinalResultAsyncが最初に呼び出された後でGetThumbnailAsyncが呼び出された場合、結果はawaitが使用されたときに結果が返され、同期して返されます。

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); 
:すべてを待つために

var photoCapture = photoCamera.BeginCapture(); 

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

関連する問題