4

3 단계로 완료되는 비동기 작업을 사용 중입니다. 완료 전에 부분 결과가 반환됩니다. 원래 이벤트를 사용하여 진행 상황을 알리고 있었으므로 await 가능한 조작 (또는 그것들의 체인)으로 적절히 포장하고 싶습니다. 하지부분 완료를위한 복수 작업 <T> 또는 IProgress <T>?

  1. CaptureStarted, 나
  2. CaptureThumbnailAvailable에 그 흥미 :

    은 (관련 결과 유형) 다음과 같은 순서로 이벤트를 발생 윈도우 폰 7에서 PhotoCamera.CaptureImage 방법이다, 정확히하려면 (스트림)

  3. CaptureImageAvailable (스트림)
  4. CaptureCompleted (부울)

어떻게 감쌀까요? 현재 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이 호출되면 두 번째 Task<T>은 대기가 사용되면 결과가 나타나며 동기식으로 반환됩니다.

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(); 

은 모든 것을 기다립니다