2011-11-11 2 views
0

나는 간단하게 보이는 무언가에 갇혀 있지만 내가 뭘 잘못하고 있는지 볼 수 없습니다. 나는 가장 낮은 값을 찾으려고하는 복잡한 계산에서 반환 된 값을 설명하는 간단한 클래스 구조 'StaticQuote'를 가지고있다. Calculate 호출이 비싸므로 계산을 병렬로 실행하기 위해 배열을 만들고, Task.WhenAll을 사용하여 StaticQuote 객체에 저장된 결과를 비교하기 전에 모두 완료 될 때까지 기다려야합니다. 나는이 과제가 완벽하게 작동 문자열 등 유사한 사례를 본비동기 CTP Task.WhenAll 문제

Cannot implicitly convert type 'System.Threading.Tasks.Task<Services.QuoteGeneratorAsync.StaticQuote[]>' to 'Services.QuoteGeneratorAsync.StaticQuote[]'

그래서 오른쪽은 반환되지 않는 이해할 수 없다 : 문제는 내가 다음과 같은 오류를 얻고있다 StaticQuotes의 배열을 반환 할 때이다 StaticQuote 결과의 배열? 나는 다중 스레드 코드와 비동기 CTP에 익숙하지 않다. 누구든지 답변을 제공 할 수 있습니까? 많은 감사합니다.

예제 문제 :

List<Task<StaticQuote>> Calculations = new List<Task<StaticQuote>>(); 
foreach() 
{ 
Calculations.Add(TaskEx.RunEx(() => Calculate(...my params....)));            
} 
StaticQuote[] Quotes=TaskEx.WhenAll<StaticQuote>(Calculations); --//this line won't compile 

답변

1

TaskEx.WhenAll 다른 모든 작업이 완료되면 나타내는 Task<T[]> 반환합니다. 그래서 당신이 원하는 :

StaticQuote[] quotes = await TaskEx.WhenAll(Calculations); 

await 표현은 "펼쳤다"는 TTask<T>. 그래서 다른 곳에서 당신이 가지고있는 경우에 :

Task<string> downloadTask = webClient.DownloadStringTaskAsync(url); 
string result = await downloadTask; 

그것은 정확히 같은 일이 - 그것은 대신 하나 하나의 태스크 입력 및 출력의 수집을 가지고 있기 때문에 WhenAll 버전이 약간 더 복잡 단지입니다.

분명히 await을 사용하려면 async 방법을 사용해야합니다.

이 모든 것이 여전히 혼란 스럽다면 those of Eric Lippert과 마찬가지로 blog posts about async을 읽고 싶을 것입니다. (물론 다른 것들도 많이 있습니다.)

+0

많은 분들께 감사드립니다. Jon은 스레드가 계속 움직일 이유를 기다리고 있지 않습니까? 나는 모든 것을 다시 호출하는 루프를위한 최상위 레벨을 가지므로 한 번에 많은 스레드를 제어하려고했습니다. 나는이 예제를 보았다. http://stackoverflow.com/questions/4174806/what-is-taskex-whenall-in-the-async-ctp 그가 여기서하는 일은 왜 나를 위해 일하지 않는가? 토니는 조랑말 어때? :) – dustybin

+0

@dustybin :'await'은 메소드가 호출자에게 리턴 할 것이지만, 모든 태스크가 완료되면이 메소드로 돌아올 것입니다. 연결된 질문 * 내의 과제는'await'을 사용합니다. 그래서 당신이 무엇을 의미하는지 확신 할 수 없습니다 ... –

+0

예를 들어 await를 사용하지만 스레드가 계속 수행하면 다음 계산을 많이 수행 할 것이라는 우려가있었습니다 내 외부 루프에서 스레드. 그것은 문제가되지 않아야합니다. Calculate()가 반환하는 데 3-5 초가 걸리는 것처럼 스레드 수를 제어 할 수 있는지 확인하려고했습니다. 한 번에 너무 많은 사람들이 달리는 것을 원하지 않았습니다. 작년에 비동기로 DDD Modern .Net day 프리젠 테이션을 했었는데 이걸 사용해야 할 첫 번째 기회입니다. 또한 WhenAll에 ".Result"속성이 있음을 알았습니다. 블로그를 읽습니다. – dustybin