「C Sharp asyncとawaitの動作確認」の版間の差分
ナビゲーションに移動
検索に移動
| (同じ利用者による、間の3版が非表示) | |||
| 1行目: | 1行目: | ||
| − | ==C# asyncとawaitの動作確認== | + | ==[[C# asyncとawaitの動作確認]]== |
| − | [[C | + | [[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 矢木浩人