SlideShare a Scribd company logo
1 of 37
Download to read offline
async/await ダークサイド is 何 
まどべんよっかいち2014/10/18Center CLR Kouji Matsui (@kekyo2)
Profile 
けきょTwitter:@kekyo2Blog: www.kekyo.net 
Center CLR2014/10/01~ 
自転車復活!
Agenda 
非同期処理のダークサイド 
ハードウェイトis 何 
同期コンテキストis 何 
MVVMとコマンドインターフェイス 
うにゃー
ようこそ非同期処理 
ウェルカム&ウェルカムバック非同期!! 
前回の非同期処理の話はもう完璧? 
いまさら恥ずかしくてasyncをawaitした(まどべんよっかいち) 
これからの「async-await」の話をしよう(名古屋GeekBar) 
アタリマエよ? 
コレからは全て非同期処理よ? 
非同期Love既定ね?
ダークサイド非同期処理 
じゃあ、非同期処理のダークサイドについて、いろいろぶちまけて おこうか。 
ア、アナタなに言ってるの 
意味フメイだワ
ハードウェイトis 何 
スレッドブロッキングで死亡
ピットフォールに落ちろ 
ここで処理が完了するのを待ちたいんだ。 
おぉ、Task.Waitなんてあるんだ。awaitなんて、良く分かんないもの使わなくても待てるじゃん。イベント ハンドラから呼ぶときはWaitすればいっか! 
非同期処理メソッド(Taskを返す) 
イベントハンドラはTaskを返さない (返せない)ので、単にWaitで待つ 
「非同期処理対応なんて 
大したことないな(実話)」
刺さる(死) 
ボタンが押された 
Waitはハードウェイトなので、スレッド1は ここで処理を停止する(=UI無応答) 
スレッド1 
スレッド1 
awaitがあるので、ここで非同期 処理を開始して、スレッド1は退出 
メソッドを抜けると、Taskに対して すぐにWaitを呼び出す 
スレッド1 
非同期処理 (HttpClient)
刺さる(死) 
非同期処理が完了すると、 
UIキューに完了を通知する 
スレッド1 
非同期処理 (HttpClient) 
しかしスレッド1はここで 
ハードウェイトしているので、 
UIキューを確認することが出来ない 
永久に動けない 
UI キュー
UIキューって何? 
Win32でいう所の「メッセージキュー」です。Windowsメッセージは、すべてこのUIキューに放 り込まれ、スレッド1(メインスレッド)が一つ一つ拾い上げて処理を行います。 
WPF・ストアアプリで言う所のDispatcher、WinFormsではInvoke/BeginInvokeの操作。 
UIキュー 
ボタンクリック 
スレッド1 
イベントハンドラ1 
イベントハンドラ2 
イベントハンドラ3 
イベントハンドラ4 
基本的にスレッド1だけが、すべての処理を順次行います。 
そのため、ボタンやマウスの操作が、順序を保って処理さ れることが保証されます(同時に実行されない)。 
順番に取り出します
UIキューと非同期処理の関係 
非同期処理の完了は、UIキューに通知されます。スレッド1が別の処理をしていたとしても、 じきにUIキューから通知を拾い上げ、await直後の処理を継続します。 
UIキュー 
(awaitの手前の処理) 
スレッド1 
非同期処理 (HttpClient) 
awaitの続き やってね 
ボタン 
押された 
(awaitの直後の処理) 
①この処理が 
完了すれば 
②これを 
拾い上げて 
③awaitを 
継続できる
ハードウェイトしてしまうと… 
UIキュー 
(awaitの手前の処理) 
スレッド1 
非同期処理 (HttpClient) 
awaitの続き やってね 
ボタン 
押された 
(awaitの直後の処理) 
この処理は 
永遠に完了しない 
拾い上げれない 
実行できない
非同期処理上での待機の教訓 
非同期処理メソッド内で ハードウェイトしてはいけ ません(殆ど絶対) 
シングルスレッドUIシステムが絡まない(=UIキューが無い)場合は、ハードウェイト出来る事も あります(例:コンソールアプリケーション)
ではどうやって対処する? 
①結局awaitするしかない 
②awaitするにはasync化するしかない 
「awaitなんて良く分かんないもの云々」と 言っていても、awaitから逃れる事は出来ない。 
従来技術での代替テクニックは存在しない。
ハードウェイトの種類 
モニターロック(Monitorクラス、lock句) 
lock句については、非同期処理メソッド内(async適用メソッド内)では使えません(コンパイルエラー)。 
try-finallyとMonitorクラスを使って同じことが出来ますが、やってはいけません。 
カーネルオブジェクトによるハードウェイト 
WaitHandleクラスを継承したクラスで、WaitHandle.WaitOne・WaitAny・WaitAllを呼び出す全ての操作。 
ManualResetEvent, AutoResetEvent, Mutex, Semaphoreなど 
間接的に呼び出しているものについても注意!Thread.Join・そしてTask.Wait・Task.WaitAllなど 
これらは全て、前回紹介したNito.AsyncExライブラリに代替同期クラスがあります。 
困った時のNuGetで!! 
https://nitoasyncex.codeplex.com/
同期コンテキストis 何 
COMのアパートメントに似た何か
UIキューで同期しなければおk? 
await後の処理を継続するのに、非同期完了の通知をUIキューに「どうしても」入れなければなら ないのか? 
UIキューに入れなきゃいいんだよね? 
ぶっちゃけ、UIキュー使わない方法は無いの? 
UI無い環境ではどうなるの?
Task.ConfigureAwaitis 何 
TaskクラスにConfigureAwaitメソッドがあり、この引数をfalseと指定すると、UIキューを使わなくなる。 
スレッド1 
スレッド1はすぐ退出 
非同期処理 (HttpClient)
Task.ConfigureAwait(false) 
await後続の処理を、ワーカー スレッドが直接実行する 
非同期処理 (HttpClient) 
ワーカースレッドに通知 
(UIキューを使わない) 
スレッド2 
UI キュー 
スレッド1 
別の作業が出来る
ファーッ?! 
意味不明だけど、要するに 
メインスレッドじゃないと 
ダメって事
Dispatcherでマーシャリングすれば? 
ConfigureAwait(false)により、await以降の処理がワーカースレッド(メインスレッドではない何か) で実行される。 
UIキューを使わないので、応答速度は速い。 
しかし、後続の処理(メソッドの終端まで)では、UIに関する処理を一切行えない。 
Dispatcher使えばおk? 
まぁ、Dispatcher使えばいいんだけど、 何のためにUIキューを無効化したのか? 
UI キュー 
スレッド1
モヤモヤする 
ロジック処理とUI制御処理を、二分出来ないか考える。 
基本的なストラテジーとして、あらかじめ単なるロジック処理をまとめて終わらせておく。その 結果を元に、UIを更新することを考える。 
ロジック処理 
(ビジネスロジックなど) 
データ 
データ 
データ 
UI制御処理 
(データバインディングなど) 
データを渡す 
ConfigureAwait(false)で 
ワーカースレッドが実行してもOK 
普通にawaitする事で、 UIキューを使わせる
ならば、非同期メソッドを独立させよう 
ConfigureAwait(false)しないので、後続の 処理はメインスレッドで実行される 
UI制御処理 
ビジネス 
ロジック 
UIに関係のある操作を行わない 
(ワーカースレッドで実行してもOK)
ややこしい遷移の全貌 
スレッド1 
スレッド1は 
一旦退出 
非同期処理 (HttpClient) 
スレッド2 
UI キュー 
スレッド1 
UIキューに通知
同期コンテキストis 何 
ConfigureAwait(true) とすると、同期コンテキストをキャプチャする。 
ConfigureAwait(false)とすると、同期コンテキストをキャプチャしない。 
日本語か、それはw 
UI キュー 
WPFやWinFormsを使う場合、 
「同期コンテキスト」とは「UIキュー」の事だ 
キャプチャする、とは、UIキューを使って 完了の通知を行う、と読み替えればOK。 
したがって、ConfigureAwait(false)する と、UIキューを使わずに、非同期操作の完 了を処理する。
MVVMとコマンドインターフェイス 
テストが問題
MVVM is 何 
Model–View–ViewModelの略 
Model –View –Controller (MVC)を、XAMLのデータバインディングを前提に構築しなおしたデ ザインパターンの一種。 
UI設計と実装(ビジネスロジックやUI制御)を分離できる。 
ViewModelやModelにロジックを集中させることで、ユニットテストの自動化が容易になる。 
XAML (View) 
<TextBoxText=“{Binding Result}” /> 
ViewModelクラス 
public string Result{ get; set; } 
同じプロパティ名 で自動転送 
ユニット 
テスト 
※本セッションでは、Modelの定義を省略
イベントもバインディングしたい 
ICommandインターフェイスをButton.Commandにバインディングする事で、イベントハンドラをバ インディング出来るようになる。 
データの入出力だけではなく、イベントハンドリングもデータバインディング出来るので、Viewと ViewModel間の通信を統一的に設計できる。 
コードビハインドを駆逐できる。 
XAML (View) 
<Button Command=“{Binding FireStart}” /> 
ViewModelクラス 
public ICommandFireStart{ get; set; } 
同じプロパティ名 で自動転送 
OnFireStart() 
Startボタン
イベントハンドラ内で非同期処理を 
OnFireStartイベントハンドラ内で非同期メソッドを呼び 出すには、async/awaitを指定しなければならない。 
イベントハンドラのシグネチャは決まっている (Action<object>)なので、「asyncvoid」としか書け ない。 
asyncvoid (Taskは返せない) 
ICommandの実装例 
ボタンクリックで Executeが呼び出される
さぁ、ViewModelをテストしよう… 
残念ながら、ユニットテストコードはまともに機能しない 
ICommand.Executeを呼び出して、 ボタンクリックをシミュレート 
ここでいきなり失敗。 
コレクションにイメージが追加され ていない?
何せ、非同期処理なのでね… 
Executeメソッドの呼び出しで処理が開始されたものの、あくまで「非同期処理」なので、バッ クグラウンドでイメージをダウンロードしている。 
しかし、テストコードはすぐに次に進んでしまうので、アサーションに失敗してしまう。 
ここに到達しても、まだダウンロード中なので、 イメージは追加されていない 
非同期処理 (OnFireStart)
わかった!テストでもawaitすればいい!! 
voidExecute(object parameter) 
orz
そこでだ。 
IAsyncCommandなるインターフェイスを作ってしまう。 
ExecuteAsyncメソッドを追加して、これを非同期メソッドとする。 
Executeが呼び出された場合は、Taskを無視する(握りつぶす)事で、 「asyncvoid」の時と同様、処理は非同期実行される。 
この処理は重要で、WPFやストアアプリからは相変わらずExecuteメソッド が呼び出される事に注意。 
Executeが呼び出された場合は、 Taskを無視して非同期処理させる。 
IAsyncCommandの実装例。 
ExecuteAsyncはTaskを返却する 
迂闊にtask.Wait()とか書いたら… 
分かってるワネ?
ViewModelとテストも修正して 
MSTestは非同期メソッドを認識 出来るので、Taskを返してやる 
晴れて普通の非同期メソッド として実装可能に
成功 
やっと完成ネ
まとめ 
とにかく使う事。 
ライブラリやフレームワークを整備するなら、WinRTを習ってどんどん非同期メソッド化してみる。 そして、それを実際に使ってみる。 
従来の.NET Frameworkのクラスライブラリで、Taskを返すバージョンのメソッドがあるなら、そ のメソッドだけを使って実装してみる。 
Taskを返さないメソッドがあるなら、Task.Run()で非同期メソッドシミュレートして使ってみる。 
使い始めると新たな課題が出てくる。良く考察して、早く身に着けてしまおう。使わないうちは、 身につかない、絶対。
ありがとうございました 
本日のコードはGitHubに上げてあります。 https://github.com/kekyo/AsyncAwaitDemonstration 
このスライドもブログに掲載予定です。 http://www.kekyo.net/ 
おいしいにゃー? 
11/1 Unveiled! 
名古屋北生涯学習センター第三集会室

More Related Content

What's hot

20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
 

What's hot (20)

インタフェース完全に理解した
インタフェース完全に理解したインタフェース完全に理解した
インタフェース完全に理解した
 
Iocコンテナについて
IocコンテナについてIocコンテナについて
Iocコンテナについて
 
Building the Game Server both API and Realtime via c#
Building the Game Server both API and Realtime via c#Building the Game Server both API and Realtime via c#
Building the Game Server both API and Realtime via c#
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。 【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
 
継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する
 
これからの「async/await」の話をしよう
これからの「async/await」の話をしようこれからの「async/await」の話をしよう
これからの「async/await」の話をしよう
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
Lean coffee
Lean coffeeLean coffee
Lean coffee
 
フロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkanフロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkan
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
Unityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTipsUnityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTips
 
async/await不要論
async/await不要論async/await不要論
async/await不要論
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 

Viewers also liked

「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Yoshifumi Kawai
 

Viewers also liked (6)

continuatioN Linking
continuatioN LinkingcontinuatioN Linking
continuatioN Linking
 
Async deepdive before de:code
Async deepdive before de:codeAsync deepdive before de:code
Async deepdive before de:code
 
Thread affinity and CPS
Thread affinity and CPSThread affinity and CPS
Thread affinity and CPS
 
Handlerさんコンニチワ
HandlerさんコンニチワHandlerさんコンニチワ
Handlerさんコンニチワ
 
ChordアルゴリズムによるDHT入門
ChordアルゴリズムによるDHT入門ChordアルゴリズムによるDHT入門
ChordアルゴリズムによるDHT入門
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
 

Similar to async/awaitダークサイド is 何

Android勉強会第二回-非同期処理-
Android勉強会第二回-非同期処理-Android勉強会第二回-非同期処理-
Android勉強会第二回-非同期処理-
Hiroki Sakamoto
 
Html5 でアプリを作るということ
Html5 でアプリを作るということHtml5 でアプリを作るということ
Html5 でアプリを作るということ
Naruto TAKAHASHI
 
Smartphone ui:ux」 de na creative seminar vol.1 レポート
Smartphone ui:ux」 de na creative seminar vol.1 レポートSmartphone ui:ux」 de na creative seminar vol.1 レポート
Smartphone ui:ux」 de na creative seminar vol.1 レポート
Masaru Kimura
 
AWS Direct Connectの構築を自動化(しようと)している話
AWS Direct Connectの構築を自動化(しようと)している話AWS Direct Connectの構築を自動化(しようと)している話
AWS Direct Connectの構築を自動化(しようと)している話
Kaoru Kitauchi
 
Vsugday2012 summer tokyo_aoyagi
Vsugday2012 summer tokyo_aoyagiVsugday2012 summer tokyo_aoyagi
Vsugday2012 summer tokyo_aoyagi
vsug_jim
 
Titanium Mobile ~本当にあったこわい話~
Titanium Mobile ~本当にあったこわい話~Titanium Mobile ~本当にあったこわい話~
Titanium Mobile ~本当にあったこわい話~
Atsushi Harada
 

Similar to async/awaitダークサイド is 何 (20)

ご注文は監視自動化ですか?
ご注文は監視自動化ですか?ご注文は監視自動化ですか?
ご注文は監視自動化ですか?
 
サーバ擬人化ユーザ会キックオフ資料 Slideshare ver
サーバ擬人化ユーザ会キックオフ資料 Slideshare verサーバ擬人化ユーザ会キックオフ資料 Slideshare ver
サーバ擬人化ユーザ会キックオフ資料 Slideshare ver
 
インフラエンジニアがk8sでアプリを作って見えた今後のインフラ
インフラエンジニアがk8sでアプリを作って見えた今後のインフラインフラエンジニアがk8sでアプリを作って見えた今後のインフラ
インフラエンジニアがk8sでアプリを作って見えた今後のインフラ
 
Stac2014 石川
Stac2014 石川Stac2014 石川
Stac2014 石川
 
Jenkinsのある生活
Jenkinsのある生活Jenkinsのある生活
Jenkinsのある生活
 
Android勉強会第二回-非同期処理-
Android勉強会第二回-非同期処理-Android勉強会第二回-非同期処理-
Android勉強会第二回-非同期処理-
 
Html5 でアプリを作るということ
Html5 でアプリを作るということHtml5 でアプリを作るということ
Html5 でアプリを作るということ
 
Smartphone ui:ux」 de na creative seminar vol.1 レポート
Smartphone ui:ux」 de na creative seminar vol.1 レポートSmartphone ui:ux」 de na creative seminar vol.1 レポート
Smartphone ui:ux」 de na creative seminar vol.1 レポート
 
サバフェスLt
サバフェスLtサバフェスLt
サバフェスLt
 
Re: ご注文は自動化ですか?[2]
Re: ご注文は自動化ですか?[2]Re: ご注文は自動化ですか?[2]
Re: ご注文は自動化ですか?[2]
 
Nodeにしましょう
NodeにしましょうNodeにしましょう
Nodeにしましょう
 
AWS Direct Connectの構築を自動化(しようと)している話
AWS Direct Connectの構築を自動化(しようと)している話AWS Direct Connectの構築を自動化(しようと)している話
AWS Direct Connectの構築を自動化(しようと)している話
 
AngularJS x Chrome Apps (2014.08.23 #gdgkobe event)
AngularJS x Chrome Apps (2014.08.23 #gdgkobe event)AngularJS x Chrome Apps (2014.08.23 #gdgkobe event)
AngularJS x Chrome Apps (2014.08.23 #gdgkobe event)
 
インタフェースのこころ
インタフェースのこころインタフェースのこころ
インタフェースのこころ
 
B 2-1 はじめての Windows Azure
B 2-1 はじめての Windows AzureB 2-1 はじめての Windows Azure
B 2-1 はじめての Windows Azure
 
Vsugday2012 summer tokyo_aoyagi
Vsugday2012 summer tokyo_aoyagiVsugday2012 summer tokyo_aoyagi
Vsugday2012 summer tokyo_aoyagi
 
“なめらか”なメトロスタイルアプリを作るために ~WinRT の非同期性を活用したアプリ開発~
“なめらか”なメトロスタイルアプリを作るために ~WinRT の非同期性を活用したアプリ開発~“なめらか”なメトロスタイルアプリを作るために ~WinRT の非同期性を活用したアプリ開発~
“なめらか”なメトロスタイルアプリを作るために ~WinRT の非同期性を活用したアプリ開発~
 
Titanium Mobile ~本当にあったこわい話~
Titanium Mobile ~本当にあったこわい話~Titanium Mobile ~本当にあったこわい話~
Titanium Mobile ~本当にあったこわい話~
 
Rnncamp01
Rnncamp01Rnncamp01
Rnncamp01
 
Rnncamp01
Rnncamp01Rnncamp01
Rnncamp01
 

More from Kouji Matsui

More from Kouji Matsui (20)

パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理
 
Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018
 
Matrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overviewMatrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overview
 
Fun with BrainPad
Fun with BrainPadFun with BrainPad
Fun with BrainPad
 
What's Functional?
What's Functional?What's Functional?
What's Functional?
 
Pitfall for WioLTE
Pitfall for WioLTEPitfall for WioLTE
Pitfall for WioLTE
 
How to make the calculator
How to make the calculatorHow to make the calculator
How to make the calculator
 
Write common, run anywhere
Write common, run anywhereWrite common, run anywhere
Write common, run anywhere
 
Locality of Reference
Locality of ReferenceLocality of Reference
Locality of Reference
 
Nespのコード生成
Nespのコード生成Nespのコード生成
Nespのコード生成
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonad
 
You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.
 
How to meets Async and Task
How to meets Async and TaskHow to meets Async and Task
How to meets Async and Task
 
Beachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITBeachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JIT
 
Async DeepDive basics
Async DeepDive basicsAsync DeepDive basics
Async DeepDive basics
 
真Intermediate languageのキホン
真Intermediate languageのキホン真Intermediate languageのキホン
真Intermediate languageのキホン
 
.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み
 
Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけよう
 
式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式
 
不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話
 

async/awaitダークサイド is 何