トップ 一覧 ping 検索 ヘルプ RSS ログイン

C# asyncとawaitの動作確認の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!C# asyncとawaitの動作確認
[C#][C#サンプルコード]
[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)
 ***** 同期メソッド終了 *****