| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

C Sharp asyncとawaitの動作確認

提供: MyMemoWiki
2020年2月16日 (日) 04:22時点におけるPiroto (トーク | 投稿記録)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

C# asyncとawaitの動作確認

C Sharp | C Sharp サンプルコード |

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)
***** 同期メソッド終了 *****