More Related Content
Similar to Windows 8時代のUXを支える非同期プログラミング
Similar to Windows 8時代のUXを支える非同期プログラミング (20)
More from Yuya Yamaki (20)
Windows 8時代のUXを支える非同期プログラミング
- 4. これから( 時代)
非同期処理の必要性、および需要
低 高
非同期処理実装の難易度
低 高
4
- 11. 「注文が決定する」イベントハンドラ
注文が決定する 注文決定イベント引数
注文 注文を得る テーブル番号
材料 材料を得る 注文
レシピ レシピを得る 注文
料理 レシピ 作成する 材料
提供する 料理 テーブル番号
11
- 12. 料理が完成するまでは一切何もできません
お客さん 料理店の人
「呼び出しボタン」
を押す 注文が決定する 注文決定イベント引数
注文 注文を得る テーブル番号
材料 材料を得る 注文
レシピ レシピを得る 注文
料理 レシピ 作成する 材料
提供する 料理 テーブル番号
料理が
運ばれてくる
12
- 13. ボタンを押すと結果が返るまで は応答不能
ユーザー メインスレッド
ボタン
を押す 注文が決定する 注文決定イベント引数
注文 注文を得る テーブル番号
材料 材料を得る 注文
レシピ レシピを得る 注文
料理 レシピ 作成する 材料
提供する 料理 テーブル番号
結果がUI上に
表示される
13
- 14. 非同期処理の種類
① 非ブロッキング (非同期 )
をブロックしないための非同期処理
② 並列処理(計算)
データ並列
タスク並列
14
- 17. スレッドを使用
SynchronizationContext ctx = SynchronizationContext.Current;
ThreadPool.QueueUserWorkItem(_ =>
{
var 注文 = 注文を得る(e.テーブル番号);
var 材料 = 材料を得る(注文);
var レシピ = レシピを得る(注文);
var 料理 = レシピ.作成する(材料);
ctx.Post(state =>
{
提供する(料理, e.テーブル番号);
}, 料理);
});
17
- 19. ①新しくスレッドを生成するのは
思った以上にコストがかかる
注文を受ける度に
新しくスレッドを生成するのは効率が悪い
ではあらかじめ用意されたスレッドをできる限り
再利用するスレッドプールという仕組みがある
レストランの例では
新しく人を雇うのには意外とコストがかかる
19
- 20. ②順序やタイミングが大切な処理は
必ず存在する
別スレッドで実行した処理の継続処理、および完了待ち
お互いがスレッドの完了を待ち続けるデッドロックや共
有メモリへのアクセスによる競合状態
レストランの例では
一人のときは全部自分がやっていたから問題が起きな
かったが、二人以上では協調して動かなければならない
20
- 22. ④スレッドプログラミングの怖さは
テストのしにくさ
回動作したから正しいという保証もないし、
回動作したから正しいという保証もない
レストランの例では
人を管理するのはとても大変で、
想像もしない行動を起こすこともある
22
- 27. タスク並列ライブラリ
( )
名前空間
名前空間
タスクとして思考すればよく、
スレッドに対する深い知識は不要
タスク並列ライブラリを使うことで、処理が
簡略化されるだけでなく、効率よく実行できる
非同期処理を簡単に操作、
および構成するメソッドを持つ
- 28. タスクを使用
var uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task<Meal> task = Task.Factory.StartNew(() =>
{
var 注文 = 注文を得る(e.テーブル番号);
var 材料 = 材料を得る(注文);
var レシピ = レシピを得る(注文);
var 料理 = レシピ.作成する(材料);
return 料理;
});
task.ContinueWith(t =>
{
提供する(t.Result, e.テーブル番号);
}, uiTaskScheduler);
28
- 30. タスクベースの非同期パターン
( )
標準クラスライブラリには、時間のかかる処理に
おいてタスクベースの非同期メソッドが用意され
ている
を返す 、および
メソッド
- 31. タスクの継続と待機
継続 メソッド
一つのタスクに対して、継続タスクを指定する
メソッド
継続元タスクが複数存在する状態で、その全てが完了した場合に継続する
メソッド
継続元タスクが複数存在する状態で、そのどれかが完了した場合に継続する
待機 メソッド
タスクを待機させる
メソッド
指定された複数のタスクを待機させる
メソッド
指定された複数のタスクの内、どれかが完了するまで待機させる
- 32. 肉を焼いてから野菜を切る
var ターキー = (肉)材料[0];
味をつける(ターキー);
オーブンで焼く(40, ターキー);
var サラダ用野菜 = (野菜)材料[1];
切る(サラダ用野菜);
皿に盛り付ける(サラダ用野菜);
皿に盛り付ける(ターキー);
32
- 33. 肉を焼いている間に野菜を切る
var ターキー = (肉)材料[0];
味をつける(ターキー);
Task task1 = オーブンで焼くAsync(40, ターキー);
var サラダ用野菜 = (野菜)材料[1];
Task task2 = 切るAsync(サラダ用野菜);
task2.ContinueWith(_ =>
{
Task task3 = 皿に盛り付けるAsync(サラダ用野菜);
});
Task.WaitAll(task1, task2);
皿に盛り付ける(ターキー);
33
- 35. 構文
メソッドに 修飾子、
非同期処理(タスクベースの非同期版メソッド)
の手前に キーワードをつけるだけ
同期処理とほぼ同様のコードをコンパイラが
機械的にタスクを使った非同期処理へと
変換してくれる
スレッドをブロックすることなくメソッドの実行を
一時停止したり再開したりできるポイントを
メソッドに埋め込む
- 36. 同期版
注文が決定する 注文決定イベント引数
注文 注文を得る テーブル番号
材料 材料を得る 注文
レシピ レシピを得る 注文
料理 レシピ 作成する 材料
提供する 料理 テーブル番号
36
- 37. 非同期版
注文が決定する 注文決定イベント引数
var 注文 = await 注文を得るAsync(e.テーブル番号);
var 材料 = await 材料を得るAsync(注文);
var レシピ = await レシピを得るAsync(注文);
var 料理 = await レシピ.作成するAsync(材料);
提供する(料理, e.テーブル番号);
37
- 39. 同期版メソッド
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Download();
debugList.Items.Add("コアラ");
}
private void Download()
{
debugList.Items.Add("パンダ");
HeavyTask();
debugList.Items.Add("うさぎ");
}
39
- 41. 非同期版メソッド
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Download();
debugList.Items.Add("コアラ");
}
private async void Download()
{
debugList.Items.Add("パンダ");
await HeavyTaskAsync();
debugList.Items.Add("うさぎ");
}
41
- 42. 非同期版の実行順序
private void Button_Click_1(…)
Download();
private async void Download()
debugList.Items.Add("パンダ");
await HeavyTaskAsync();
中断
debugList.Items.Add("コアラ");
時間のかかる処理
再開
debugList.Items.Add("うさぎ");
42
- 44. 高まる非同期処理の重要性
① タッチ における応答継続の重要性
“ ” (指に吸い付く )
タッチ は基本的に全画面
② ネット世代における
ブラウザーは常に非同期
③ マルチコア時代
ムーアの法則の恩恵を受けるためにも
44
- 45. 高まる非同期の必然性
側から
の場合
非同期版メソッドが用意されているのは、
主に通信&データにおける のみ
スタイルアプリ/ の場
合
実行に ミリ秒以上の時間がかかる可能性のあるメソッドは
すべて非同期化されている
システム( )側から
では、メインスレッドが 秒以上
応答しなければ強制終了
45
- 46. Metroスタイルアプリ用のWinRT API
ユーザー インターフェイス
HTML5/CSS XAML DirectX コントロール データバインディング
SVG タイル 入力 アクセシビリティ 印刷
デバイス 通信 & データ
地理位置情報 プリンター NFC XML Web
コントラクト
センサー ポータブルデバイス
ネットワーク 通知 ストリーム
メディア
ローカル & クラウドストレージ AtomPub
キャプチャ 視覚効果
バックグラウンド転送 SMS
リモート再生 コード変換
基礎部分
アプリの グローバリ
有効期間
認証 暗号化
ゼーション
.NET Win32
46
- 47. 時代に向けて
スタイルアプリ開発では
多くの処理を非同期にせざるを得ない
時代はフリーズしない が当たり前
スタイルアプリの開発では、
、 、 言語( / )
の 種類がありますが、
/ のように同期操作と
ほぼ同等の記述ができるのは 言語だけ
47