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

MyMemoWiki

C Sharp asyncとawaitの動作確認

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

C# asyncとawaitの動作確認

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net.Http;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace Concurrent
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. var me = new Program();
  15. me.UnBlockingRequest();
  16. Console.WriteLine("***** 非同期メソッド終了 *****");
  17.  
  18. me.BlockingRequest();
  19. Console.WriteLine("***** 同期メソッド終了 *****");
  20. }
  21.  
  22. private void BlockingRequest()
  23. {
  24. Console.WriteLine("***** 同期メソッド開始 *****");
  25. using (var client = new HttpClient())
  26. {
  27. var req = new HttpRequestMessage(HttpMethod.Head, "http://typea.info/blg/glob/");
  28.  
  29. Console.WriteLine("***** 同期メソッド リクエスト結果を待つ *****");
  30. // await キーワードを使用せず、Resultを使用
  31. HttpResponseMessage response
  32. = client.SendAsync(req, HttpCompletionOption.ResponseHeadersRead).Result;
  33.  
  34. var headerStrings = from header in response.Headers
  35. select $"{header.Key}:{string.Join(",",header.Value)}"
  36. ;
  37. string headerList = string.Join(Environment.NewLine, headerStrings);
  38.  
  39.  
  40. Console.WriteLine("***** 同期メソッド結果出力 *****");
  41. Console.WriteLine(headerList);
  42. }
  43. }
  44.  
  45. private async void UnBlockingRequest()
  46. {
  47. Console.WriteLine("***** 非同期メソッド開始 *****");
  48. using (var client = new HttpClient())
  49. {
  50. var req = new HttpRequestMessage(HttpMethod.Head, "http://typea.info/blg/glob/");
  51.  
  52. Console.WriteLine("***** 非同期メソッド リクエスト結果を待たずにメソッド終了し、結果が返ったら以降の処理を実行 *****");
  53. // await キーワードを使用
  54. HttpResponseMessage response
  55. = await client.SendAsync(req, HttpCompletionOption.ResponseHeadersRead);
  56.  
  57. var headerStrings = from header in response.Headers
  58. select $"{header.Key}:{string.Join(",", header.Value)}"
  59. ;
  60. string headerList = string.Join(Environment.NewLine, headerStrings);
  61.  
  62.  
  63. Console.WriteLine("***** 非同期メソッド結果出力 *****");
  64. Console.WriteLine(headerList);
  65. }
  66. }
  67.  
  68. }
  69. }

結果

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