32
async/await deep dive -Community Open Day 2012- June 9 th , 2012 xin9le

async/await deep dive

Embed Size (px)

DESCRIPTION

2012/06/09 Community Open Day 2012 セッション資料

Citation preview

Page 1: async/await deep dive

async/awaitdeep dive

-Community Open Day 2012-

June 9th, 2012

xin9le

Page 2: async/await deep dive

AgendaProfileName鈴木孝明

Twitter Account@xin9le

Bloghttp://xin9le.net/

OccupationProgrammer

HobbyProgramming, Piano, Tennis, English

Page 3: async/await deep dive

Agenda1. 非同期処理の基礎

2. 非同期メソッドの概要

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

4. WinRTとの相互運用

5. まとめ

Page 4: async/await deep dive

Basis for Asynchronous

Page 5: async/await deep dive

Sync vs Async Why is it important ?UIスレッド

応答可能

UIスレッド 別スレッド

応答不能

Page 6: async/await deep dive

Why is it important ?• UIが長くフリーズするのを防ぐ

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

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

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

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

避けては通れない課題

Page 7: async/await deep dive

History Quick Review

Task-based

async/await

Reactive Extensions

Event-based

Async Programming ModelThreadPool

Thread

Page 8: async/await deep dive

Quick Review-ちょこっとコードを見てみよう-

Page 9: async/await deep dive

About Asynchronous Method

Page 10: async/await deep dive

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

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

async Modifier await

Page 11: async/await deep dive

await Operator Can• 対象のタスクが完了していない場合、以降の処理を

継続タスクとして登録

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

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

return

Page 12: async/await deep dive

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

• await演算子は式が書ける箇所ならどこでも利用可能

Page 13: async/await deep dive

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

• 自前でUIスレッドに処理を戻す必要なし

• 後述の独自Awaitableパターン実装時はその限りではない

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

• ConfigureAwaitメソッド

• True : 同期する False : 同期しない

UI Marshaling

Page 14: async/await deep dive

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

• void型

• 非同期メソッドの完了を待機する必要がない場合

• イベントハンドラなどで利用

• Task / Task<T>型

• 非同期メソッドの完了を待機したり、戻り値を取得する必要がある場合

Page 15: async/await deep dive

• 同期処理と同様の例外処理が可能

• APMやEAPの例外処理はカオスになりがち

Exception Handling

Page 16: async/await deep dive

Internal Implementation-dive into asynchronous method-

Page 17: async/await deep dive

Decompile Essence• コンパイラはasync/awaitをどう変換しているのか

• 中間言語(IL)を逆コンパイルして解析

• ILSpy (http://wiki.sharpdevelop.net/ILSpy.ashx) が便利

Page 18: async/await deep dive

Essence Compiler Requirement

Page 19: async/await deep dive

Compiler Requirement

• GetAwaiterメソッドを持つ

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

• 自身のメソッドでも拡張メソッドでもOK

-awaitableになるためには-

Page 20: async/await deep dive

Compiler Requirement

• INotifyCompletionインターフェースを実装

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

• IsCompletedプロパティを持つ

• GetResultメソッドを持つ

• 戻り値の型は問われない

-awaiterになるためには-

Page 21: async/await deep dive

Custom Implementation-Let’s try!!-

Page 22: async/await deep dive

Interoperabilitywith WinRT-one step ahead-

Page 23: async/await deep dive

Async on WinRT Convert to Task• WinRTの非同期操作は以下のいずれかを実装

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

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

• 完了後に設定してもCallbackされる

Progress

Yes No

Resu

lts

Yes IAsyncOperationWithProgress IAsyncOperation

No IAsyncActionWithProgress IAsyncAction

これをawaitできればMetroの開発が楽に!!

Page 24: async/await deep dive

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

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

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

Page 25: async/await deep dive

Direct await .NET Standard• .AsTask();とか毎回×2書きたくない...

• .AsTask();と書かずにawaitするには?

• GetAwaiterを実装すればよい (参照 : コンパイラ要件)

• 以下は完全に同等

Page 26: async/await deep dive

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

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

• 非同期処理をキャンセルする

• 進捗通知を行う

• 複数の非同期処理がすべて完了するまで待機する

• 以後の処理をUIスレッドに戻さない (etc...)

Page 27: async/await deep dive

Today’s Summary-ココだけは押さえよう!!-

Page 28: async/await deep dive

Summary Summary• async/awaitはペアで利用する

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

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

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

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

Page 29: async/await deep dive

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

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

• Awaiterになるためには以下の実装が必要

• INotifyCompletionインターフェース

• IsCompletedプロパティ

• GetResultメソッド

Page 30: async/await deep dive

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

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

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

• 非同期処理のキャンセル

• 進捗通知 (etc...)

Page 31: async/await deep dive

Reference Thanks• WinRTとawaitを掘り下げる

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

• Windowsランタイムの非同期性により高速で滑らかなアプリにするhttp://blogs.msdn.com/b/windowsappdev_ja/archive/2012/03/26/windows.aspx

• Windows Developer Days 2012 | Cannel 9http://channel9.msdn.com/Events/Windows-Developer-Days/Windows-Developer-Days-2012

Page 32: async/await deep dive

ThanksThank you for your attending.

Enjoy Asynchronous!!with .NET Framework 4.5