2016-06-16 7 views
0

REST API에 연결하고 여러 오브젝트를 가져 오기 위해 여러 엔드 포인트를 호출 중입니다.일련의 메소드를 병렬로 실행하십시오.

RestService<Agent> agentService = new RestService<Agent>(auth, new AgentApi()); 
RestService<Ticket> ticketService = new RestService<Ticket>(auth, new TicketApi()); 
RestService<Company> companyService = new RestService<Company>(auth, new CompanyApi()); 
RestService<Contact> contactService = new RestService<Contact>(auth, new ContactApi()); 

RestService<T>를 들어 내가 다음 결과 나머지 API를 호출하여 얻을 수 GetAll() 전화 : 장면 GetAll() 뒤에

RestResult<Agent> agentResults = agentService.GetAll(); 
RestResult<Company> companyResults = companyService.GetAll(); 
RestResult<Contact> contactResults = contactService.GetAll(); 
RestResult<Ticket> ticketResults = ticketService.GetAll(); 

숫자를 만들어 내가 다운로드 할 각 유형에 대한 RestService<T> 작성 HttpWebRequest 재발행

그래서 저는 어떻게 든 4 GetAll()을 병렬로 호출해야한다고 말합니다. 이론적으로 나는 하나가 아닌 REST API에 여러 요청을 할 수 있습니다.

RestResult<Agent> agentResults; 
RestResult<Company> companyResults; 
RestResult<Contact> contactResults; 
RestResult<Ticket> ticketResults; 

Parallel.Invoke(
    () => agentResults = agentService.GetAll(), 
    () => companyResults = companyService.GetAll(), 
    () => contactResults = contactService.GetAll(), 
    () => ticketResults = ticketService.GetAll() 
); 

그러나 변수가 초기화되지 않습니다 것 같습니다 : 내가 가진

하나의 아이디어였다.

이 방법에 대한 제안 사항은 무엇입니까?

+0

"이처럼 보인다"무엇을 의미 하는가 :

가장 쉬운 해결책은 기본값 (null)를 수동으로 initalize하는 것입니다? 그들은 여전히 ​​'null'입니까? 그렇다면'GetAll()'메소드가 다른 것을 반환했는지 확인하고 싶습니까? –

+0

미안하지만, 나는 나중에 변수를 사용하려고 할 때 변수가 할당되지 않았다는 컴파일 오류가 발생한다는 것을 의미했습니다. – moose56

답변

2

당신의 컴파일러는 컴파일러가 의미를 Parallel.Invoke()을 이해하지 못하기 때문에 변수가 초기화되지 않습니다 있음을 경고합니다.

컴파일러가 알고있는 유일한 점은 그 함수에 람다를 전달한다는 것입니다. 그러나 그들이 처형 될 때 추측 할 수는 없습니다. 컴파일러는 Action이 완료 될 때 Parallel.Invoke() 만 반환한다는 것을 모릅니다. 그리고 그것은 특히 당신의 람다가 변수를 초기화하고 있다는 것을 모릅니다.

따라서 컴파일러의 관점에서 보면 Parallel.Invoke() 이후에도 변수에 값을 지정하지 않았습니다.

RestResult<Agent> agentResults = null; 
RestResult<Company> companyResults = null; 
RestResult<Contact> contactResults = null; 
RestResult<Ticket> ticketResults = null; 

Parallel.Invoke(
    () => agentResults = agentService.GetAll(Epoch), 
    () => companyResults = companyService.GetAll(Epoch), 
    () => contactResults = contactService.GetAll(Epoch), 
    () => ticketResults = ticketService.GetAll(Epoch) 
); 
+0

감사합니다. 나는 뭔가를 놓치고 있는지 확실하지 않았습니다. – moose56

1

이 질문을 한 번 보시고 귀하와 같은 문제가있는 것 같습니다. Parallel.Invoke는 비동기 작업을 기다리지 않는 것 같습니다. 대신 모든 작업이 완료 될 때까지 기다려야 Task.WhenAll를 사용 Parallel.Invoke does not wait for async methods to complete

RestResult<Agent> agentResults; 
RestResult<Company> companyResults; 
RestResult<Contact> contactResults; 
RestResult<Ticket> ticketResults; 

var t1 = Task.Run(() => agentResults = agentService.GetAll(Epoch)) 
var t2 = Task.Run(() => companyResults = companyService.GetAll(Epoch)); 
var t3 = Task.Run(() => contactResults = contactService.GetAll(Epoch)); 
var t4 = Taks.Run(() => ticketResults = ticketService.GetAll(Epoch)); 

await Task.WhenAll(t1,t2,t3,t4); 
//results should be filled here 
+0

그 이유가 아니라고 생각합니다. OP가'Parallel.Invoke()'에 전달하는 것은 _not_'async'입니다. 'GetAll'가'Task'를 돌려 주었다고하더라도, 변수에 할당되어야합니다. 그리고 문서'Parallel.Invoke'에 따르면 모든'Action'이 완료된 경우에만 반환됩니다. –

+0

고마워,하지만 내가 기다렸다가 나중에 사용하려고하면 변수가 할당되지 않는다는 컴파일 오류가 발생합니다. – moose56

+0

죄송합니다. 코드 조각을 코드로 변환하는 것에서부터 머리 부분을 빨리 벗어나서 죄송합니다. 자신의 예제처럼 코드를 'null'로 지정할 수 있습니다. 간과 했었습니다. 결과를 람다 식으로 반환하고 작업 결과를 캡처하는 것이 더 좋을 것입니다. 그러나 René가 지적했듯이, 나는 당신의 작업을 비동기로 가정하고 이것이 문제의 원인이되었다. –

관련 문제