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 矢木浩人