トップ 差分 一覧 ping ソース 検索 ヘルプ PDF RSS ログイン

C# asyncとawaitの動作確認


RSS 無料英単語

目次



記事一覧

キーワード

C# asyncとawaitの動作確認

[C#][C# サンプルコード]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace Concurrent
{
    class Program
    {
        static void Main(string[] args)
        {
            var me = new Program();
            me.UnBlockingRequest();
            Console.WriteLine("***** 非同期メソッド終了 *****");

            me.BlockingRequest();
            Console.WriteLine("***** 同期メソッド終了 *****");
        }

        
        private void BlockingRequest()
        {
            Console.WriteLine("***** 同期メソッド開始 *****");
            using (var client = new HttpClient())
            {
                var req = new HttpRequestMessage(HttpMethod.Head, "http://typea.info/blg/glob/");

                Console.WriteLine("***** 同期メソッド リクエスト結果を待つ *****");
                // await キーワードを使用せず、Resultを使用
                HttpResponseMessage response 
                    = client.SendAsync(req, HttpCompletionOption.ResponseHeadersRead).Result;

                var headerStrings = from header in response.Headers
                                    select $"{header.Key}:{string.Join(",",header.Value)}"
                                    ;
                string headerList = string.Join(Environment.NewLine, headerStrings);


                Console.WriteLine("***** 同期メソッド結果出力 *****");
                Console.WriteLine(headerList);
            }
        }

        private async void UnBlockingRequest()
        {
            Console.WriteLine("***** 非同期メソッド開始 *****");
            using (var client = new HttpClient())
            {
                var req = new HttpRequestMessage(HttpMethod.Head, "http://typea.info/blg/glob/");

                Console.WriteLine("***** 非同期メソッド リクエスト結果を待たずにメソッド終了し、結果が返ったら以降の処理を実行 *****");
                // await キーワードを使用
                HttpResponseMessage response
                    = await client.SendAsync(req, HttpCompletionOption.ResponseHeadersRead);

                var headerStrings = from header in response.Headers
                                    select $"{header.Key}:{string.Join(",", header.Value)}"
                                    ;
                string headerList = string.Join(Environment.NewLine, headerStrings);


                Console.WriteLine("***** 非同期メソッド結果出力 *****");
                Console.WriteLine(headerList);
            }
        }

    }
}

結果

  • 結果出力の順序が異なる
例1
***** 非同期メソッド開始 *****
***** 非同期メソッド リクエスト結果を待たずにメソッド終了し、結果が返ったら以降の処理を実行 *****
***** 非同期メソッド終了 *****
***** 同期メソッド開始 *****
***** 同期メソッド リクエスト結果を待つ *****
***** 非同期メソッド結果出力 *****
Connection:close
Accept-Ranges:bytes
Date:Sun, 24 Dec 2017 00:14:21 GMT
ETag:"5b98aca-103b6-723edcc0"
Server:Apache/2.2.3,(CentOS)
***** 同期メソッド結果出力 *****
Connection:close
Accept-Ranges:bytes
Date:Sun, 24 Dec 2017 00:14:21 GMT
ETag:"5b98aca-103b6-723edcc0"
Server:Apache/2.2.3,(CentOS)
***** 同期メソッド終了 *****
例2
***** 非同期メソッド開始 *****
***** 非同期メソッド リクエスト結果を待たずにメソッド終了し、結果が返ったら以降の処理を実行 *****
***** 非同期メソッド終了 *****
***** 同期メソッド開始 *****
***** 同期メソッド リクエスト結果を待つ *****
***** 同期メソッド結果出力 *****
Connection:close
Accept-Ranges:bytes
Date:Sun, 24 Dec 2017 00:15:06 GMT
ETag:"5b98aca-103b6-723edcc0"
Server:Apache/2.2.3,(CentOS)
***** 非同期メソッド結果出力 *****
Connection:close
Accept-Ranges:bytes
Date:Sun, 24 Dec 2017 00:15:06 GMT
ETag:"5b98aca-103b6-723edcc0"
Server:Apache/2.2.3,(CentOS)
***** 同期メソッド終了 *****



YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto