SlideShare a Scribd company logo
1 of 32
Download to read offline
async/await
deep dive
-Community Open Day 2012-

June 9th, 2012
xin9le
Profile Agenda
Name

鈴木孝明

Twitter Account
@xin9le

Blog

http://xin9le.net/

Occupation
Programmer

Hobby

Programming, Piano, Tennis, English
Agenda
1. 非同期処理の基礎
2. 非同期メソッドの概要
3. 非同期メソッドの内部実装

4. WinRTとの相互運用
5. まとめ
Basis for
Asynchronous
Sync vs Async Why
UIスレッド

UIスレッド

応答不能

応答可能

別スレッド
Why is it important ?
UIが長くフリーズするのを防ぐ

•
•

タッチデバイスでは不快感が特に顕著

•

I/Oなどをバックグラウンド処理して効率化

•

多機能化によるパフォーマンスの劣化への対処
•

複数コアを利用した並列処理

避けては通れない課題
History Quick Revie
async/await
Reactive Extensions
Event-based

Task-based

Async Programming Model

ThreadPool
Thread
Quick Review
-ちょこっとコードを見てみよう-
About
Asynchronous
Method
async Modifier awa
•

修飾した関数は1つ以上のawait演算子を含む

•

await演算子以降をコンパイラによって継続渡しに
await Operator Can
•

対象のタスクが完了していない場合、以降の処理を
継続タスクとして登録

•

完了したら、登録しておいた継続タスクを実行

•

待機中、呼び出し元スレッドをブロックしない
(= 即座にreturnされる)

return
Can use anywhere
•

async修飾子はラムダ式や匿名メソッドにも適用可能

•

await演算子は式が書ける箇所ならどこでも利用可能
UI Marshaling
継続処理は自動的にUIスレッド上で実行される

•
•
•

自前でUIスレッドに処理を戻す必要なし
後述の独自Awaitableパターン実装時はその限りではない

UIスレッドに戻すかどうかは明示的に制御可能

•
•
•

ConfigureAwaitメソッド
True : 同期する
False : 同期しない
Return Value Excep
•

非同期メソッドの戻り値の型は以下のいずれか

•

void型
•

•

非同期メソッドの完了を待機する必要がない場合
イベントハンドラなどで利用

Task / Task<T>型

•
•

非同期メソッドの完了を待機したり、戻り値を取得する
必要がある場合
Exception Handling
同期処理と同様の例外処理が可能

•
•

APMやEAPの例外処理はカオスになりがち
Internal
Implementation
-dive into asynchronous method-
Decompile Essence
コンパイラはasync/awaitをどう変換しているのか

•
•
•

中間言語(IL)を逆コンパイルして解析
ILSpy (http://wiki.sharpdevelop.net/ILSpy.ashx) が便利
Essence Compiler Req
Compiler Requirement
-awaitableになるためにはGetAwaiterメソッドを持つ

•
•

返されるAwaiterの型は問われない (classでもstructでもOK)

•

自身のメソッドでも拡張メソッドでもOK
Compiler Requirement
-awaiterになるためにはINotifyCompletionインターフェースを実装

•
•

OnCompletedメソッドの実装の義務付け

IsCompletedプロパティを持つ
GetResultメソッドを持つ

•
•
•

戻り値の型は問われない
Custom
Implementation
-Let’s try!!-
Interoperability
with WinRT
-one step ahead-
Async on WinRT Co
WinRTの非同期操作は以下のいずれかを実装

•

Progress

Results

Yes

No

Yes

IAsyncOperationWithProgress

IAsyncOperation

No

IAsyncActionWithProgress

IAsyncAction

すべてCompletedプロパティを持つ

•
•
•

完了時に呼び出されるデリゲートを1度だけ設定可能
完了後に設定してもCallbackされる

これをawaitできればMetroの開発が楽に!!
Convert to Task Dire
•

これらのInterfaceをTaskに変換できればawait可能

•

TaskCompletionSource<T>を使って拡張メソッド化
•

内部保持するTaskの完了をSetResultメソッドなどで制御
Direct await .NET S
•

•

•

.AsTask();とか毎回×2書きたくない...

.AsTask();と書かずにawaitするには?
• GetAwaiterを実装すればよい (参照 : コンパイラ要件)

以下は完全に同等
.NET Standard
•

標準で多数の拡張メソッドが提供されている

•

awaitをより高度に扱う場合はAsTaskを利用
•
•

•
•

非同期処理をキャンセルする
進捗通知を行う
複数の非同期処理がすべて完了するまで待機する
以後の処理をUIスレッドに戻さない (etc...)
Today’s Summary
-ココだけは押さえよう!!-
Summary Summary
•

async/awaitはペアで利用する

•

非同期メソッド中にawaitは何度でも書ける

•

残りの処理は継続として登録され、関数から抜ける

•

継続処理は自動的にUIスレッド上で実行される

•

同期処理と同様の例外処理ができる
Summary Summary
•

コンパイラによって内部的に構造体が生成される

•

GetAwaiterメソッドがあればawait可能

•

Awaiterになるためには以下の実装が必要
• INotifyCompletionインターフェース
• IsCompletedプロパティ
• GetResultメソッド
Summary Reference
•

WinRTは非同期処理は4つのInterfaceからなる

•

標準で用意された拡張メソッドでawait可能

•

より高度な操作が必要な場合はAsTaskを利用
•
•

非同期処理のキャンセル
進捗通知 (etc...)
Reference Thanks
•

WinRTとawaitを掘り下げる

•

非同期処理

•

非同期メソッドの内部実装

•

Windowsランタイムの非同期性により高速で滑らかなア
プリにする

http://blogs.msdn.com/b/windowsappdev_ja/archive/2012/04/30/winrt-await.aspx

http://ufcpp.net/study/csharp/sp5_async.html

http://ufcpp.net/study/csharp/sp5_awaitable.html

http://blogs.msdn.com/b/windowsappdev_ja/archive/2012/03/26/windows.aspx

•

Windows Developer Days 2012 | Cannel 9

http://channel9.msdn.com/Events/Windows-Developer-Days/Windows-Developer-Days2012
Thanks
Thank you for your attending.

Enjoy Asynchronous!!
with .NET Framework 4.5

More Related Content

What's hot (7)

20190319 KIS Open Seminar LT
20190319 KIS Open Seminar LT20190319 KIS Open Seminar LT
20190319 KIS Open Seminar LT
 
Effective java1
Effective java1Effective java1
Effective java1
 
はんなりPython #45
はんなりPython #45はんなりPython #45
はんなりPython #45
 
KyotoLT(Online) 第26回
KyotoLT(Online) 第26回KyotoLT(Online) 第26回
KyotoLT(Online) 第26回
 
Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけよう
 
メタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらばメタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらば
 
Nespのコード生成
Nespのコード生成Nespのコード生成
Nespのコード生成
 

Similar to async/await deep dive

Vsugday2012 summer tokyo_aoyagi
Vsugday2012 summer tokyo_aoyagiVsugday2012 summer tokyo_aoyagi
Vsugday2012 summer tokyo_aoyagi
vsug_jim
 
opensource and accessibility (Dec2000) Part 1
opensource and accessibility (Dec2000) Part 1opensource and accessibility (Dec2000) Part 1
opensource and accessibility (Dec2000) Part 1
Takuya Nishimoto
 
20101127 Android Usability Seminar
20101127 Android Usability Seminar20101127 Android Usability Seminar
20101127 Android Usability Seminar
Visso株式会社
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.js
ishiki-takai
 
Kobe sec#7 summary
Kobe sec#7 summaryKobe sec#7 summary
Kobe sec#7 summary
Yukio NAGAO
 

Similar to async/await deep dive (20)

Vsugday2012 summer tokyo_aoyagi
Vsugday2012 summer tokyo_aoyagiVsugday2012 summer tokyo_aoyagi
Vsugday2012 summer tokyo_aoyagi
 
“なめらか”なメトロスタイルアプリを作るために ~WinRT の非同期性を活用したアプリ開発~
“なめらか”なメトロスタイルアプリを作るために ~WinRT の非同期性を活用したアプリ開発~“なめらか”なメトロスタイルアプリを作るために ~WinRT の非同期性を活用したアプリ開発~
“なめらか”なメトロスタイルアプリを作るために ~WinRT の非同期性を活用したアプリ開発~
 
Usage of Thread Pool for Non blocking frameworks
Usage of Thread Pool for Non blocking frameworksUsage of Thread Pool for Non blocking frameworks
Usage of Thread Pool for Non blocking frameworks
 
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
 
iOSやAndroidアプリ開発のGoodPractice
iOSやAndroidアプリ開発のGoodPracticeiOSやAndroidアプリ開発のGoodPractice
iOSやAndroidアプリ開発のGoodPractice
 
HTML5とか勉強会#48 ionic
HTML5とか勉強会#48 ionicHTML5とか勉強会#48 ionic
HTML5とか勉強会#48 ionic
 
Ansibleは簡単なIT自動化
Ansibleは簡単なIT自動化Ansibleは簡単なIT自動化
Ansibleは簡単なIT自動化
 
opensource and accessibility (Dec2000) Part 1
opensource and accessibility (Dec2000) Part 1opensource and accessibility (Dec2000) Part 1
opensource and accessibility (Dec2000) Part 1
 
20131201 テスト自動化カンファレンスLT「激しいUI変更との戦い」
20131201 テスト自動化カンファレンスLT「激しいUI変更との戦い」20131201 テスト自動化カンファレンスLT「激しいUI変更との戦い」
20131201 テスト自動化カンファレンスLT「激しいUI変更との戦い」
 
20101127 Android Usability Seminar
20101127 Android Usability Seminar20101127 Android Usability Seminar
20101127 Android Usability Seminar
 
ネットワークエンジニア的Ansibleの始め方
ネットワークエンジニア的Ansibleの始め方ネットワークエンジニア的Ansibleの始め方
ネットワークエンジニア的Ansibleの始め方
 
失敗と向き合う姿勢を正す話
失敗と向き合う姿勢を正す話失敗と向き合う姿勢を正す話
失敗と向き合う姿勢を正す話
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.js
 
Osdt2015 saito
Osdt2015 saitoOsdt2015 saito
Osdt2015 saito
 
Nodeにしましょう
NodeにしましょうNodeにしましょう
Nodeにしましょう
 
第39回「Windows Server 2003 EOSに備えよう -SQL Serverはどうする?-」(2014/12/18 on しすなま!)
第39回「Windows Server 2003 EOSに備えよう -SQL Serverはどうする?-」(2014/12/18 on しすなま!)第39回「Windows Server 2003 EOSに備えよう -SQL Serverはどうする?-」(2014/12/18 on しすなま!)
第39回「Windows Server 2003 EOSに備えよう -SQL Serverはどうする?-」(2014/12/18 on しすなま!)
 
サーバ擬人化ユーザ会キックオフ資料 Slideshare ver
サーバ擬人化ユーザ会キックオフ資料 Slideshare verサーバ擬人化ユーザ会キックオフ資料 Slideshare ver
サーバ擬人化ユーザ会キックオフ資料 Slideshare ver
 
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
 
OpenSpan_PreMarketing
OpenSpan_PreMarketingOpenSpan_PreMarketing
OpenSpan_PreMarketing
 
Kobe sec#7 summary
Kobe sec#7 summaryKobe sec#7 summary
Kobe sec#7 summary
 

More from Takaaki Suzuki

More from Takaaki Suzuki (20)

5 分で学ぶ Interpolated String Handler
5 分で学ぶ Interpolated String Handler5 分で学ぶ Interpolated String Handler
5 分で学ぶ Interpolated String Handler
 
C# における Redis 徹底活用
C# における Redis 徹底活用C# における Redis 徹底活用
C# における Redis 徹底活用
 
Inside FastEnum
Inside FastEnumInside FastEnum
Inside FastEnum
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
30min Serverless xTuber
30min Serverless xTuber30min Serverless xTuber
30min Serverless xTuber
 
Tetris Algorithm
Tetris AlgorithmTetris Algorithm
Tetris Algorithm
 
C# 7 New Features
C# 7 New FeaturesC# 7 New Features
C# 7 New Features
 
Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7
 
C# 7 Current Status
C# 7 Current StatusC# 7 Current Status
C# 7 Current Status
 
4 Colors Othello’s Algorithm
4 Colors Othello’s Algorithm4 Colors Othello’s Algorithm
4 Colors Othello’s Algorithm
 
Sharing Deep Dive
Sharing Deep DiveSharing Deep Dive
Sharing Deep Dive
 
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
4 Colors Othello’s Algorithm @仙台 IT 文化祭 20174 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
 
DeclarativeSql
DeclarativeSqlDeclarativeSql
DeclarativeSql
 
Sevens Algorithm
Sevens AlgorithmSevens Algorithm
Sevens Algorithm
 
Friendly
FriendlyFriendly
Friendly
 
WPF Interoperability
WPF InteroperabilityWPF Interoperability
WPF Interoperability
 
Universal Appとは? -デバイスに依存しないアプリケーション開発-
Universal Appとは? -デバイスに依存しないアプリケーション開発-Universal Appとは? -デバイスに依存しないアプリケーション開発-
Universal Appとは? -デバイスに依存しないアプリケーション開発-
 
酒の肴はC# vNext
酒の肴はC# vNext酒の肴はC# vNext
酒の肴はC# vNext
 
SignalR Tune-up
SignalR Tune-upSignalR Tune-up
SignalR Tune-up
 
Twilioと.NET
Twilioと.NETTwilioと.NET
Twilioと.NET
 

async/await deep dive