async/await deep dive

5,049 views
4,840 views

Published on

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

Published in: Technology, Sports
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,049
On SlideShare
0
From Embeds
0
Number of Embeds
4,230
Actions
Shares
0
Downloads
13
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

async/await deep dive

  1. 1. async/await deep dive -Community Open Day 2012- June 9th, 2012 xin9le
  2. 2. Profile Agenda Name 鈴木孝明 Twitter Account @xin9le Blog http://xin9le.net/ Occupation Programmer Hobby Programming, Piano, Tennis, English
  3. 3. Agenda 1. 非同期処理の基礎 2. 非同期メソッドの概要 3. 非同期メソッドの内部実装 4. WinRTとの相互運用 5. まとめ
  4. 4. Basis for Asynchronous
  5. 5. Sync vs Async Why UIスレッド UIスレッド 応答不能 応答可能 別スレッド
  6. 6. Why is it important ? UIが長くフリーズするのを防ぐ • • タッチデバイスでは不快感が特に顕著 • I/Oなどをバックグラウンド処理して効率化 • 多機能化によるパフォーマンスの劣化への対処 • 複数コアを利用した並列処理 避けては通れない課題
  7. 7. History Quick Revie async/await Reactive Extensions Event-based Task-based Async Programming Model ThreadPool Thread
  8. 8. Quick Review -ちょこっとコードを見てみよう-
  9. 9. About Asynchronous Method
  10. 10. async Modifier awa • 修飾した関数は1つ以上のawait演算子を含む • await演算子以降をコンパイラによって継続渡しに
  11. 11. await Operator Can • 対象のタスクが完了していない場合、以降の処理を 継続タスクとして登録 • 完了したら、登録しておいた継続タスクを実行 • 待機中、呼び出し元スレッドをブロックしない (= 即座にreturnされる) return
  12. 12. Can use anywhere • async修飾子はラムダ式や匿名メソッドにも適用可能 • await演算子は式が書ける箇所ならどこでも利用可能
  13. 13. UI Marshaling 継続処理は自動的にUIスレッド上で実行される • • • 自前でUIスレッドに処理を戻す必要なし 後述の独自Awaitableパターン実装時はその限りではない UIスレッドに戻すかどうかは明示的に制御可能 • • • ConfigureAwaitメソッド True : 同期する False : 同期しない
  14. 14. Return Value Excep • 非同期メソッドの戻り値の型は以下のいずれか • void型 • • 非同期メソッドの完了を待機する必要がない場合 イベントハンドラなどで利用 Task / Task<T>型 • • 非同期メソッドの完了を待機したり、戻り値を取得する 必要がある場合
  15. 15. Exception Handling 同期処理と同様の例外処理が可能 • • APMやEAPの例外処理はカオスになりがち
  16. 16. Internal Implementation -dive into asynchronous method-
  17. 17. Decompile Essence コンパイラはasync/awaitをどう変換しているのか • • • 中間言語(IL)を逆コンパイルして解析 ILSpy (http://wiki.sharpdevelop.net/ILSpy.ashx) が便利
  18. 18. Essence Compiler Req
  19. 19. Compiler Requirement -awaitableになるためにはGetAwaiterメソッドを持つ • • 返されるAwaiterの型は問われない (classでもstructでもOK) • 自身のメソッドでも拡張メソッドでもOK
  20. 20. Compiler Requirement -awaiterになるためにはINotifyCompletionインターフェースを実装 • • OnCompletedメソッドの実装の義務付け IsCompletedプロパティを持つ GetResultメソッドを持つ • • • 戻り値の型は問われない
  21. 21. Custom Implementation -Let’s try!!-
  22. 22. Interoperability with WinRT -one step ahead-
  23. 23. Async on WinRT Co WinRTの非同期操作は以下のいずれかを実装 • Progress Results Yes No Yes IAsyncOperationWithProgress IAsyncOperation No IAsyncActionWithProgress IAsyncAction すべてCompletedプロパティを持つ • • • 完了時に呼び出されるデリゲートを1度だけ設定可能 完了後に設定してもCallbackされる これをawaitできればMetroの開発が楽に!!
  24. 24. Convert to Task Dire • これらのInterfaceをTaskに変換できればawait可能 • TaskCompletionSource<T>を使って拡張メソッド化 • 内部保持するTaskの完了をSetResultメソッドなどで制御
  25. 25. Direct await .NET S • • • .AsTask();とか毎回×2書きたくない... .AsTask();と書かずにawaitするには? • GetAwaiterを実装すればよい (参照 : コンパイラ要件) 以下は完全に同等
  26. 26. .NET Standard • 標準で多数の拡張メソッドが提供されている • awaitをより高度に扱う場合はAsTaskを利用 • • • • 非同期処理をキャンセルする 進捗通知を行う 複数の非同期処理がすべて完了するまで待機する 以後の処理をUIスレッドに戻さない (etc...)
  27. 27. Today’s Summary -ココだけは押さえよう!!-
  28. 28. Summary Summary • async/awaitはペアで利用する • 非同期メソッド中にawaitは何度でも書ける • 残りの処理は継続として登録され、関数から抜ける • 継続処理は自動的にUIスレッド上で実行される • 同期処理と同様の例外処理ができる
  29. 29. Summary Summary • コンパイラによって内部的に構造体が生成される • GetAwaiterメソッドがあればawait可能 • Awaiterになるためには以下の実装が必要 • INotifyCompletionインターフェース • IsCompletedプロパティ • GetResultメソッド
  30. 30. Summary Reference • WinRTは非同期処理は4つのInterfaceからなる • 標準で用意された拡張メソッドでawait可能 • より高度な操作が必要な場合はAsTaskを利用 • • 非同期処理のキャンセル 進捗通知 (etc...)
  31. 31. 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
  32. 32. Thanks Thank you for your attending. Enjoy Asynchronous!! with .NET Framework 4.5

×