2012-03-26 3 views
5

새 ASP.NET 웹 API HttpClient가 저에게 이상한 결과를주었습니다. 여기 내 코드는 다음과 같습니다.HttpClient GetStringAsync - 결코 돌아 오지 않습니다.

class Program { 

    static async void Main(string[] args) { 

     var address = "http://localhost:3895/api/urls"; 

     Console.WriteLine(await getStringAsync(address)); 
     Console.ReadLine(); 

    } 

    public static async Task<string> getStringAsync(string uri) { 

     var httpClient = new HttpClient(); 
     return await httpClient.GetStringAsync(uri); 
    } 
} 

이것은 결코 돌아 오지 않으며 콘솔이 갑자기 나타나서 사라집니다. 아래 코드를 변경하면 다음과 같이 작동합니다.

static void Main(string[] args) { 

    var address = "http://localhost:3895/api/urls"; 

    Console.WriteLine(getString(address)); 
    Console.ReadLine(); 

} 

public static string getString(string uri) { 

    var httpClient = new HttpClient(); 

    return httpClient.GetStringAsync(uri).Result; 
} 

어떤 점이 좋을까요?

+1

컴파일조차하지 않습니다. 진입 점 ('Main')은 비동기가 될 수 없습니다. CS4009 오류로 실패합니다. – vcsjones

+0

@vcsjones 비동기 CTP에서 허용됩니다 (하지만 나쁜 생각) – hvd

+1

@hvd 흥미 롭습니다. 그들이 지금 그것을 거부하는 것이 가장 좋습니다. – vcsjones

답변

9

async (Main)은 VS11/.NET 4.5 컴파일러에서 허용되지 않으므로 비동기 CTP를 사용하고 있다고 가정합니다. .NET 4.5가 모든 옵션을 사용한다면 스위치를 만드십시오.

async 또는 더 일반적으로 작업은 실행될 코드의 나머지 부분에 대해 어떤 식으로 신호를 보낼 수 있기 때문에 작동하지 않는 이유는 다릅니다. 코드가 동 기적으로 실행되므로 문제가 적용되지 않으므로 .Result과 작동합니다.

일반적으로 예를 들어 WinForms와 같은 방식으로 메시지 루프를 사용하지 않기 때문에 콘솔 응용 프로그램에 대한 지원 기능은 기본적으로 제공되지 않지만 , 특히 GeneralThreadAffineContext.cs을 보면 작동하는 기본 예제를 얻을 수 있습니다. 콘솔 응용 프로그램에서도 마찬가지입니다.

관련 문제