C Sharp asyncとawaitの動作確認
ナビゲーションに移動
検索に移動
C# asyncとawaitの動作確認
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) ***** 同期メソッド終了 *****
© 2006 矢木浩人