2014-06-16 14 views
1

비동기에 대한 내 이해를 테스트하고 C#에서 기다리고 다음과 같은 (일반 콘솔 응용 프로그램) 작성했습니다. 선없는,비동기/대기 흐름

Before the await: 
Async result: System.Threading.Tasks.Task'1[System.Int32] 

내 질문은 "는 await를 한 후에는 :"다음

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Console.WriteLine("Async result: " + getLengthFromWebsiteAsync()); 
    } 

    public static async Task<int> getLengthFromWebsiteAsync() 
    { 
     HttpClient httpClient = new HttpClient(); 
     Task<string> sampleTask = httpClient.GetStringAsync("http://www.adobe.com"); 

     Console.WriteLine("Before the await: "); 

     int lengthRequired = (await sampleTask).Length; 
     Console.WriteLine("After the await: " + lengthRequired.ToString()); 
     return lengthRequired; 
    } 

내가 실행에있어 결과 표시하는데? 비동기/대기의 흐름을 이해하는 데 잘못된 길을 가고 있습니까?

+0

여전히'await getLengthFromWebsiteAsync()'해야합니다. 콘솔 앱의 비동기는 다소 까다 롭습니다. [콘솔 앱의 기본 메소드에서 비동기] (http://stackoverflow.com/q/9208921/247702)를 참조하십시오. – Stijn

+3

너무 일찍 너무 행복합니다. 과제의 결과를 묻습니다. –

답변

7

현재 당신은 입니다. 작업은입니다. 그러나 완료하지는 않았습니다. 작업을하기 전에 프로그램이 종료됩니다. 이것은 콘솔 응용 프로그램이기 때문에 작업이 완료 될 때까지

, 연속성을 어쨌든 스레드 풀 스레드에서 실행됩니다, 그래서 당신은 Main 방법 블록을 만드는 코드를 변경할 수 있습니다

public static void Main(string[] args) 
{ 
    Console.WriteLine("Async result: " + getLengthFromWebsiteAsync().Result); 
} 

일반적으로 당신이해야 매우ResultWait()을 사용하면 교착 상태가 발생할 수 있으므로주의해야합니다. (예를 들어 WinForms UI에서 위의 작업을 수행하는 것이 안전하지 않을 수 있습니다. Result 호출은 작업이 완료 될 때까지 UI 스레드를 차단합니다 ... 작업이 UI 스레드가 실행될 수있을 때까지 대기하게됩니다. 계속) 비동기 메서드에서 await 뒤에.

관련 문제