2012-03-26 71 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

+0

@vcsjones非同期CTPでは許可されていますが(悪い考えです) – hvd

+1

@hvd面白いです。彼らは今でもそれを許可しないことをお勧めします。 – vcsjones

答えて

9

asyncオンMainはVS11/.NET 4.5コンパイラでは許可されていませんので、私はあなたが非同期CTPを使用していると仮定しています。 .NET 4.5をすべて使用する場合は、スイッチを作成してください。

async、またはより一般的には、タスクは実行されるコードの残りの部分を何らかの方法で通知することができるためです。コードが同期的に実行されるため、問題は適用されないため、.Resultと動作します。

通常はWinFormsなどの方法でメッセージループを使用しないため、コンソールアプリケーションの組み込みサポートはありませんが、GeneralThreadAffineContext.csを見れば、動作する基本的な例が得られます。Microsoft Visual Studio Async CTP\Samples\(C# Testing) Unit Testing\AsyncTestUtilitiesコンソールアプリケーションでも。

関連する問題