2012年11月30日金曜日

[C#] async, await

メソッドの宣言に async を付けると非同期メソッドとなり、メソッドの中で
awaitが指定できるようになる。
await を指定すると非同期メソッドの実行が終わるまで待ってから制御を戻す。

分かりやすい参考サイト
http://ufcpp.net/study/csharp/sp5_async.html#async


HttpClientクラスを使って、asyncとawaitを試してみる。

■どこからかコピペしてきたりしてつくった、おれおれサンプル

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("読み込みを開始します");

            // 非同期で実行
            readWebAsync("http://www.google.co.jp/").ContinueWith(
                (task) =>
                {
                    // task.Result に読み込んだ文字列が入ってる
                    Console.WriteLine(task.Result.Count() + "文字読み込みました。");
                });

            Console.WriteLine("読み込みを待っています");
            Console.ReadKey();
        }

        private static async Task<string> readWebAsync(string url)
        {
            HttpClient client = new HttpClient();
            var res = await client.GetStringAsync(url);
            Console.WriteLine("読み込み完了!");
            return res;
        }
    }



■実行結果
読み込みを開始します
読み込みを待っています
読み込み完了!
46568文字読み込みました。



readWebAsyncメソッドを変えて、応答ステータスコードを取得してみる

        private static async Task<string> readWebAsync(string url)
        {
            HttpClient client = new HttpClient();

            var res = await client.GetAsync(url);

            Console.WriteLine("リクエスト送信&レスポンス受け取り完了!");

            // 成功ステータスコードがチェックする
            res.EnsureSuccessStatusCode();

            Console.WriteLine("ステータスコード:" + res.StatusCode);

            Console.WriteLine("リクエスト内容:" + res.RequestMessage);

            var result = await res.Content.ReadAsStringAsync();

            Console.WriteLine("読み込み完了!");

            return result;
        }



■変更後の実行結果
読み込みを開始します
読み込みを待っています
リクエスト送信&レスポンス受け取り完了!
ステータスコード:OK
リクエスト内容:Method: GET, RequestUri: 'http://www.google.co.jp/', Version: 1.1, Content: <null>, Headers:
{
}
読み込み完了!
46648文字読み込みました。



どうでもいいけど Mainメソッドに async をつけようとしたらコンパイル時に
「'async'修飾子を指定できないエントリポイント」と怒られた(´・ω・`)


ついでにHttpClientについての参考ブログ
http://shiba-yan.hatenablog.jp/entry/20120822/1345563275

0 件のコメント:

コメントを投稿