2012-03-26 226 views
5

新的ASP.NET Web 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 2012-03-26 19:23:03

+0

@vcsjones在允許Async CTP(但是一個壞主意) – hvd 2012-03-26 19:25:59

+1

@ hvd有趣。儘管他們現在最好不要。 – vcsjones 2012-03-26 19:27:20

回答

9

asyncMain在VS11/.NET 4.5編譯器中是不允許的,所以我假設你使用的是Async CTP。如果完全可以選擇使用.NET 4.5,請切換開關。

除此之外,它不起作用的原因是因爲async或更一般的任務依賴於能夠以某種方式發信號給剩餘的代碼執行。它適用於.Result,因爲代碼同步運行,所以問題不適用。

沒有內置的控制檯應用程序支持,因爲它們通常不像WinForms那樣使用消息循環,但可以查看Microsoft Visual Studio Async CTP\Samples\(C# Testing) Unit Testing\AsyncTestUtilities,特別是GeneralThreadAffineContext.cs,以獲得一個基本示例在控制檯應用程序中。

相關問題