「C Sharp asyncとawaitの動作確認」の版間の差分
ナビゲーションに移動
検索に移動
(同じ利用者による、間の1版が非表示) | |||
1行目: | 1行目: | ||
− | ==C# asyncとawaitの動作確認== | + | ==[[C# asyncとawaitの動作確認]]== |
− | + | [[C Sharp]] | [[C Sharp サンプルコード]] | | |
using System; | using System; | ||
16行目: | 16行目: | ||
{ | { | ||
var me = new Program(); | var me = new Program(); | ||
− | me. | + | me.UnBlocking[[R]]equest(); |
Console.WriteLine("***** 非同期メソッド終了 *****"); | Console.WriteLine("***** 非同期メソッド終了 *****"); | ||
− | me. | + | me.Blocking[[R]]equest(); |
Console.WriteLine("***** 同期メソッド終了 *****"); | Console.WriteLine("***** 同期メソッド終了 *****"); | ||
} | } | ||
− | private void | + | private void Blocking[[R]]equest() |
{ | { | ||
Console.WriteLine("***** 同期メソッド開始 *****"); | Console.WriteLine("***** 同期メソッド開始 *****"); | ||
using (var client = new HttpClient()) | using (var client = new HttpClient()) | ||
{ | { | ||
− | var req = new | + | var req = new Http[[R]]equestMessage(HttpMethod.Head, "http://typea.info/blg/glob/"); |
Console.WriteLine("***** 同期メソッド リクエスト結果を待つ *****"); | Console.WriteLine("***** 同期メソッド リクエスト結果を待つ *****"); | ||
− | // await | + | // await キーワードを使用せず、[[R]]esultを使用 |
− | + | Http[[R]]esponseMessage response | |
− | = client.SendAsync(req, HttpCompletionOption. | + | = client.SendAsync(req, HttpCompletionOption.Response[[Header]]sRead).Result; |
− | var headerStrings = from header in response. | + | var headerStrings = from header in response.[[Header]]s |
select $"{header.Key}:{string.Join(",",header.Value)}" | select $"{header.Key}:{string.Join(",",header.Value)}" | ||
; | ; | ||
− | string headerList = string.Join( | + | string headerList = string.Join(En[[vi]]ronment.NewLine, headerStrings); |
47行目: | 47行目: | ||
} | } | ||
− | private async void | + | private async void UnBlocking[[R]]equest() |
{ | { | ||
Console.WriteLine("***** 非同期メソッド開始 *****"); | Console.WriteLine("***** 非同期メソッド開始 *****"); | ||
using (var client = new HttpClient()) | using (var client = new HttpClient()) | ||
{ | { | ||
− | var req = new | + | var req = new Http[[R]]equestMessage(HttpMethod.Head, "http://typea.info/blg/glob/"); |
Console.WriteLine("***** 非同期メソッド リクエスト結果を待たずにメソッド終了し、結果が返ったら以降の処理を実行 *****"); | Console.WriteLine("***** 非同期メソッド リクエスト結果を待たずにメソッド終了し、結果が返ったら以降の処理を実行 *****"); | ||
// await キーワードを使用 | // await キーワードを使用 | ||
− | + | Http[[R]]esponseMessage response | |
− | = await client.SendAsync(req, HttpCompletionOption. | + | = await client.SendAsync(req, HttpCompletionOption.Response[[Header]]sRead); |
− | var headerStrings = from header in response. | + | var headerStrings = from header in response.[[Header]]s |
select $"{header.Key}:{string.Join(",", header.Value)}" | select $"{header.Key}:{string.Join(",", header.Value)}" | ||
; | ; | ||
− | string headerList = string.Join( | + | string headerList = string.Join(En[[vi]]ronment.NewLine, headerStrings); |
82行目: | 82行目: | ||
***** 非同期メソッド結果出力 ***** | ***** 非同期メソッド結果出力 ***** | ||
Connection:close | Connection:close | ||
− | Accept- | + | Accept-[[R]]anges:bytes |
Date:Sun, 24 Dec 2017 00:14:21 GMT | Date:Sun, 24 Dec 2017 00:14:21 GMT | ||
ETag:"5b98aca-103b6-723edcc0" | ETag:"5b98aca-103b6-723edcc0" | ||
− | Server:Apache/2.2.3,(CentOS) | + | Server:[[Apache]]/2.2.3,(CentOS) |
***** 同期メソッド結果出力 ***** | ***** 同期メソッド結果出力 ***** | ||
Connection:close | Connection:close | ||
− | Accept- | + | Accept-[[R]]anges:bytes |
Date:Sun, 24 Dec 2017 00:14:21 GMT | Date:Sun, 24 Dec 2017 00:14:21 GMT | ||
ETag:"5b98aca-103b6-723edcc0" | ETag:"5b98aca-103b6-723edcc0" | ||
− | Server:Apache/2.2.3,(CentOS) | + | Server:[[Apache]]/2.2.3,(CentOS) |
***** 同期メソッド終了 ***** | ***** 同期メソッド終了 ***** | ||
=====例2===== | =====例2===== | ||
101行目: | 101行目: | ||
***** 同期メソッド結果出力 ***** | ***** 同期メソッド結果出力 ***** | ||
Connection:close | Connection:close | ||
− | Accept- | + | Accept-[[R]]anges:bytes |
Date:Sun, 24 Dec 2017 00:15:06 GMT | Date:Sun, 24 Dec 2017 00:15:06 GMT | ||
ETag:"5b98aca-103b6-723edcc0" | ETag:"5b98aca-103b6-723edcc0" | ||
− | Server:Apache/2.2.3,(CentOS) | + | Server:[[Apache]]/2.2.3,(CentOS) |
***** 非同期メソッド結果出力 ***** | ***** 非同期メソッド結果出力 ***** | ||
Connection:close | Connection:close | ||
− | Accept- | + | Accept-[[R]]anges:bytes |
Date:Sun, 24 Dec 2017 00:15:06 GMT | Date:Sun, 24 Dec 2017 00:15:06 GMT | ||
ETag:"5b98aca-103b6-723edcc0" | ETag:"5b98aca-103b6-723edcc0" | ||
− | Server:Apache/2.2.3,(CentOS) | + | Server:[[Apache]]/2.2.3,(CentOS) |
***** 同期メソッド終了 ***** | ***** 同期メソッド終了 ***** |
2020年2月16日 (日) 04:22時点における最新版
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 矢木浩人