2013-09-02 9 views
0

웹 요청을 사용하여 다른 부분 (텍스트, HTML 및 제목)을받는 전자 메일이 있습니다. 나는 시간을 줄이기 위해 동시에 프로그램을 얻길 바란다. 나는 달성하고자하는 것의 아래에 단순화 된 버전을 작성했다.비동기/응답 대기 시스템이 응답 대기 중

public static async Task<MailMessage> GetEmailMessage(string subjectUrl, string bodyUrl) 
{ 
    var mailMessage = new MailMessage(); 

    var subjectTask = new HttpClient().GetStringAsync(subjectUrl); 
    var bodyTask = new HttpClient().GetStringAsync(bodyUrl); 

    mailMessage.Subject = await subjectTask; 
    mailMessage.Body = await bodyTask; 

    return mailMessage; 
} 

제목과 본문에 대한 프로그램을 사용하고 싶습니다. 일단 둘 다 가지고 있으면 MailMessage를 반환하십시오.

나는이 비동기식을 처음 접했고, 어떤 도움을 주시면 감사하겠습니다.

========= 해결 ========= 나에게 문제가 제 기능 아니었다 실현하기위한 @SLaks에

그래서 감사합니다. 내가 전화를하는 방식이었다. 밝혀 지, 내 경우에는 (나는 값 유형이 아닌 참조 유형을 반환한다고 생각합니다.) 실제로는 대기를 수행하기 전에 작업 <>. 결과를 호출해야했습니다.

즉 : 이것은 하지 완료 될 때까지 기다린 것입니다 :

var mailMessage = GetEmailMessage("urlhere", "http://www.google.com"); 

그러나 이것은 (이하 "결과"에 주목한다이 요구되고 :이 게시물을 희망

var mailMessage = GetEmailMessage("urlhere", "http://www.google.com").Result; 

은과 다른 사람을 도움 동일한 문제가 발생합니다. 해피 코딩

+1

비동기 작업 결과를 동 기적으로 기다리고 있습니다. 이것은 거의 좋은 생각이 아닙니다. 대신 호출하는 메소드를 async와 aswait로 비동기 연산으로 만들어야한다. – SLaks

답변

3

코드 정확히 일치합니다.

GetStringAsync()을 호출하면 비동기 요청이 시작됩니다.

await 첫 번째 경우, 해당 메서드가 끝날 때까지 메소드가 실행을 중지합니다. 다른 요청은 그 시간 동안 계속 실행됩니다.

두 번째 작업을 시작하기 전에 첫 번째 작업을 await 수행했다면 원하는 작업을 수행하지 못했을 것입니다.

+0

그것이 내가 생각한 것입니다. 그러나 코드를 단계별로 살펴보면 명령문을 기다리고 즉시 함수가 존재하며 내 프로그램을 계속 수행합니다. 나는 그것이 끝날 때까지 "기다리는 subjectTask"에서 멈추고 그것이 끝날 때까지 "몸무게 기다리기"에서 멈추고 싶습니다. 그리고 나서 둘 다 끝나면, 내 프로그램으로 돌아가고 싶습니다. – Talon

+0

아, 제 실수를 찾았습니다. 해결책이 질문에 추가되었습니다. 도와 주셔서 감사합니다! – Talon