Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
bleis tift
PDF, PPTX
29,077 views
async/await不要論
並列/並行基礎勉強会での発表資料です。 補足エントリもどうぞ。 http://bleis-tift.hatenablog.com/entry/asyncawaitdis
Technology
◦
Read more
54
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 43
2
/ 43
Most read
3
/ 43
4
/ 43
Most read
5
/ 43
6
/ 43
7
/ 43
8
/ 43
9
/ 43
10
/ 43
11
/ 43
12
/ 43
13
/ 43
14
/ 43
15
/ 43
16
/ 43
17
/ 43
18
/ 43
19
/ 43
20
/ 43
21
/ 43
22
/ 43
23
/ 43
24
/ 43
25
/ 43
26
/ 43
27
/ 43
28
/ 43
29
/ 43
30
/ 43
31
/ 43
32
/ 43
33
/ 43
34
/ 43
35
/ 43
36
/ 43
37
/ 43
38
/ 43
39
/ 43
40
/ 43
41
/ 43
42
/ 43
43
/ 43
More Related Content
PPTX
Msを16倍出し抜くwpf開発2回目
by
cct-inc
PDF
Oss貢献超入門
by
Michihito Shigemura
PDF
ドメイン駆動設計 本格入門
by
増田 亨
PDF
Prism + ReactiveProperty入門
by
一希 大田
PDF
ブルックスのいう銀の弾丸とは何か?
by
Yoshitaka Kawashima
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
by
Takuto Wada
PDF
PostgreSQLアンチパターン
by
Soudai Sone
PDF
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
by
Jun-ichi Sakamoto
Msを16倍出し抜くwpf開発2回目
by
cct-inc
Oss貢献超入門
by
Michihito Shigemura
ドメイン駆動設計 本格入門
by
増田 亨
Prism + ReactiveProperty入門
by
一希 大田
ブルックスのいう銀の弾丸とは何か?
by
Yoshitaka Kawashima
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
by
Takuto Wada
PostgreSQLアンチパターン
by
Soudai Sone
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
by
Jun-ichi Sakamoto
What's hot
PDF
オブジェクト指向の設計と実装の学び方のコツ
by
増田 亨
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
by
増田 亨
PPTX
本当は恐ろしい分散システムの話
by
Kumazaki Hiroki
PDF
ドメイン駆動設計サンプルコードの徹底解説
by
増田 亨
PPTX
C#/WPFで作るデスクトップマスコット入門
by
Fujikido
PDF
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
by
Koichiro Matsuoka
PDF
世界でいちばんわかりやすいドメイン駆動設計
by
増田 亨
PDF
できる!並列・並行プログラミング
by
Preferred Networks
PPTX
20150530 めとべや東京 Reactive Property + Livetで作るWPFアプリ
by
Takayoshi Tanaka
PPTX
async/await のしくみ
by
信之 岩永
PPTX
C#メタプログラミング概略 in 2021
by
Atsushi Nakamura
PDF
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
PDF
ユーザーインタビューからその後どうするの?得られた情報を「UXデザイン」に落とし込む方法 | UXデザイン基礎セミナー 第3回
by
Yoshiki Hayama
PPTX
HttpClient詳解、或いは非同期の落とし穴について
by
Yoshifumi Kawai
PDF
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
PDF
オブジェクト指向エクササイズのススメ
by
Yoji Kanno
PDF
ユーザーインタビューするときは、どうやらゾンビのおでましさ
by
Yoshiki Hayama
PDF
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
PDF
「顧客の声を聞かない」とはどういうことか
by
Yoshiki Hayama
PDF
Pythonによる黒魔術入門
by
大樹 小倉
オブジェクト指向の設計と実装の学び方のコツ
by
増田 亨
ドメインオブジェクトの見つけ方・作り方・育て方
by
増田 亨
本当は恐ろしい分散システムの話
by
Kumazaki Hiroki
ドメイン駆動設計サンプルコードの徹底解説
by
増田 亨
C#/WPFで作るデスクトップマスコット入門
by
Fujikido
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
by
Koichiro Matsuoka
世界でいちばんわかりやすいドメイン駆動設計
by
増田 亨
できる!並列・並行プログラミング
by
Preferred Networks
20150530 めとべや東京 Reactive Property + Livetで作るWPFアプリ
by
Takayoshi Tanaka
async/await のしくみ
by
信之 岩永
C#メタプログラミング概略 in 2021
by
Atsushi Nakamura
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
ユーザーインタビューからその後どうするの?得られた情報を「UXデザイン」に落とし込む方法 | UXデザイン基礎セミナー 第3回
by
Yoshiki Hayama
HttpClient詳解、或いは非同期の落とし穴について
by
Yoshifumi Kawai
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
オブジェクト指向エクササイズのススメ
by
Yoji Kanno
ユーザーインタビューするときは、どうやらゾンビのおでましさ
by
Yoshiki Hayama
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
「顧客の声を聞かない」とはどういうことか
by
Yoshiki Hayama
Pythonによる黒魔術入門
by
大樹 小倉
Viewers also liked
PDF
How to Make Own Framework built on OWIN
by
Yoshifumi Kawai
PDF
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
by
Yoshifumi Kawai
PDF
C#次世代非同期処理概観 - Task vs Reactive Extensions
by
Yoshifumi Kawai
PDF
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
by
Yoshifumi Kawai
PDF
The History of Reactive Extensions
by
Yoshifumi Kawai
PDF
Reactive Programming by UniRx for Asynchronous & Event Processing
by
Yoshifumi Kawai
PDF
UniRx - Reactive Extensions for Unity
by
Yoshifumi Kawai
PDF
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
by
Unity Technologies Japan K.K.
PDF
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
by
Yoshifumi Kawai
PPTX
RuntimeUnitTestToolkit for Unity
by
Yoshifumi Kawai
PDF
NextGen Server/Client Architecture - gRPC + Unity + C#
by
Yoshifumi Kawai
PDF
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
by
Yoshifumi Kawai
KEY
MHA, Murakumo & Me
by
Michael H. Oshita
KEY
Automation tech casual_talks_1_20120717
by
Makoto Haruyama
KEY
ぼくがかんがえたさいきょうの☆きっくすたーと☆
by
Naoya Nakazawa
PDF
Devとopsをつなぐpuppet
by
yuzorock
PDF
Embulk, an open-source plugin-based parallel bulk data loader
by
Sadayuki Furuhashi
PDF
Binary Reading in C#
by
Yoshifumi Kawai
PDF
マイクロサービス化設計入門 - AWS Dev Day Tokyo 2017
by
Yusuke Suzuki
How to Make Own Framework built on OWIN
by
Yoshifumi Kawai
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
by
Yoshifumi Kawai
C#次世代非同期処理概観 - Task vs Reactive Extensions
by
Yoshifumi Kawai
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
by
Yoshifumi Kawai
The History of Reactive Extensions
by
Yoshifumi Kawai
Reactive Programming by UniRx for Asynchronous & Event Processing
by
Yoshifumi Kawai
UniRx - Reactive Extensions for Unity
by
Yoshifumi Kawai
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
by
Unity Technologies Japan K.K.
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
by
Yoshifumi Kawai
RuntimeUnitTestToolkit for Unity
by
Yoshifumi Kawai
NextGen Server/Client Architecture - gRPC + Unity + C#
by
Yoshifumi Kawai
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
by
Yoshifumi Kawai
MHA, Murakumo & Me
by
Michael H. Oshita
Automation tech casual_talks_1_20120717
by
Makoto Haruyama
ぼくがかんがえたさいきょうの☆きっくすたーと☆
by
Naoya Nakazawa
Devとopsをつなぐpuppet
by
yuzorock
Embulk, an open-source plugin-based parallel bulk data loader
by
Sadayuki Furuhashi
Binary Reading in C#
by
Yoshifumi Kawai
マイクロサービス化設計入門 - AWS Dev Day Tokyo 2017
by
Yusuke Suzuki
Similar to async/await不要論
PDF
これからの「async/await」の話をしよう
by
Kouji Matsui
PPTX
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
by
Tusyoshi Matsuzaki
PDF
いまさら恥ずかしくてAsyncをawaitした
by
Kouji Matsui
PDF
Windows 8時代のUXを支える非同期プログラミング
by
Yuya Yamaki
PPTX
非同期処理の基礎
by
信之 岩永
PPTX
An other world awaits you
by
信之 岩永
PDF
パターンでわかる! .NET Coreの非同期処理
by
Kouji Matsui
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
by
Unity Technologies Japan K.K.
PPTX
C# 8.0 非同期ストリーム
by
信之 岩永
PDF
Mono is Dead
by
melpon
PDF
async/await deep dive
by
Takaaki Suzuki
PDF
Async deepdive before de:code
by
Kouji Matsui
PDF
Windows ストア アプリでスレッド間排他処理
by
Yasuhiko Yamamoto
PDF
async/awaitダークサイド is 何
by
Kouji Matsui
PDF
非同期の時代がやってくる!
by
Takaaki Suzuki
PDF
Reactive Extensionsで非同期処理を簡単に
by
Yoshifumi Kawai
PDF
Async DeepDive basics
by
Kouji Matsui
PDF
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
by
Yoshifumi Kawai
PPTX
Reactive
by
Akihiro Ikezoe
PDF
Async History in .NET
by
Takaaki Suzuki
これからの「async/await」の話をしよう
by
Kouji Matsui
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
by
Tusyoshi Matsuzaki
いまさら恥ずかしくてAsyncをawaitした
by
Kouji Matsui
Windows 8時代のUXを支える非同期プログラミング
by
Yuya Yamaki
非同期処理の基礎
by
信之 岩永
An other world awaits you
by
信之 岩永
パターンでわかる! .NET Coreの非同期処理
by
Kouji Matsui
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
by
Unity Technologies Japan K.K.
C# 8.0 非同期ストリーム
by
信之 岩永
Mono is Dead
by
melpon
async/await deep dive
by
Takaaki Suzuki
Async deepdive before de:code
by
Kouji Matsui
Windows ストア アプリでスレッド間排他処理
by
Yasuhiko Yamamoto
async/awaitダークサイド is 何
by
Kouji Matsui
非同期の時代がやってくる!
by
Takaaki Suzuki
Reactive Extensionsで非同期処理を簡単に
by
Yoshifumi Kawai
Async DeepDive basics
by
Kouji Matsui
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
by
Yoshifumi Kawai
Reactive
by
Akihiro Ikezoe
Async History in .NET
by
Takaaki Suzuki
More from bleis tift
PDF
PCさえあればいい。
by
bleis tift
PDF
F#の基礎(?)
by
bleis tift
PDF
No more Legacy documents
by
bleis tift
PPTX
解説?FSharp.Quotations.Compiler
by
bleis tift
PDF
効果の低いテストの話
by
bleis tift
PDF
テストの自動化を考える前に
by
bleis tift
PDF
札束でExcelを殴る
by
bleis tift
PDF
.NET系開発者から見たJava
by
bleis tift
PDF
SI屋のためのF# ~DSL編~
by
bleis tift
PDF
F#事例発表
by
bleis tift
PDF
yield and return (poor English ver)
by
bleis tift
PDF
yieldとreturnの話
by
bleis tift
PDF
F#の基礎(嘘)
by
bleis tift
PDF
現実(えくせる)と戦う話
by
bleis tift
PDF
ラムダでウィザード 滅せよ手続き、とチャーチは言った (※言ってません)
by
bleis tift
PDF
F#によるFunctional Programming入門
by
bleis tift
PDF
VBAを書きたくない話(Excel-DNAの紹介)
by
bleis tift
PDF
Better C#の脱却を目指して
by
bleis tift
PDF
モナドハンズオン前座
by
bleis tift
PDF
JSX / Haxe / TypeScript
by
bleis tift
PCさえあればいい。
by
bleis tift
F#の基礎(?)
by
bleis tift
No more Legacy documents
by
bleis tift
解説?FSharp.Quotations.Compiler
by
bleis tift
効果の低いテストの話
by
bleis tift
テストの自動化を考える前に
by
bleis tift
札束でExcelを殴る
by
bleis tift
.NET系開発者から見たJava
by
bleis tift
SI屋のためのF# ~DSL編~
by
bleis tift
F#事例発表
by
bleis tift
yield and return (poor English ver)
by
bleis tift
yieldとreturnの話
by
bleis tift
F#の基礎(嘘)
by
bleis tift
現実(えくせる)と戦う話
by
bleis tift
ラムダでウィザード 滅せよ手続き、とチャーチは言った (※言ってません)
by
bleis tift
F#によるFunctional Programming入門
by
bleis tift
VBAを書きたくない話(Excel-DNAの紹介)
by
bleis tift
Better C#の脱却を目指して
by
bleis tift
モナドハンズオン前座
by
bleis tift
JSX / Haxe / TypeScript
by
bleis tift
Recently uploaded
PDF
安価な ロジック・アナライザを アナライズ(?),Analyze report of some cheap logic analyzers
by
たけおか しょうぞう
PPTX
DrupalCon Nara 2025の記録 .
by
iPride Co., Ltd.
PDF
visionOS TC「新しいマイホームで過ごすApple Vision Proとの新生活」
by
Sugiyama Yugo
PDF
基礎から学ぶ PostgreSQL の性能監視 (PostgreSQL Conference Japan 2025 発表資料)
by
NTT DATA Technology & Innovation
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):東京大学情報基盤センター テーマ1/2/3「Society5.0の実現を目指す『計算・データ・学習...
by
PC Cluster Consortium
PDF
第25回FA設備技術勉強会_自宅で勉強するROS・フィジカルAIアイテム.pdf
by
TomohiroKusu
安価な ロジック・アナライザを アナライズ(?),Analyze report of some cheap logic analyzers
by
たけおか しょうぞう
DrupalCon Nara 2025の記録 .
by
iPride Co., Ltd.
visionOS TC「新しいマイホームで過ごすApple Vision Proとの新生活」
by
Sugiyama Yugo
基礎から学ぶ PostgreSQL の性能監視 (PostgreSQL Conference Japan 2025 発表資料)
by
NTT DATA Technology & Innovation
PCCC25(設立25年記念PCクラスタシンポジウム):東京大学情報基盤センター テーマ1/2/3「Society5.0の実現を目指す『計算・データ・学習...
by
PC Cluster Consortium
第25回FA設備技術勉強会_自宅で勉強するROS・フィジカルAIアイテム.pdf
by
TomohiroKusu
async/await不要論
1.
async/await不要論 2013/3/23 bleis-tif t
2.
自己紹介 いつの間にか発表者にされていた系 仕事ではきょんくんをいじって遊んでます なんか発表者にされていたので、仕事中にきょんくんをいじっていたらきょんくんが ロックフリーの発表をすることになりました 基礎の話とかできないので、基礎勉強会なのに応用よりの話をします Microsoft MVP
for Visual F# を受賞してますが、今日はC#の話が中心です
3.
async/await不要論・・・の前に
4.
昔話をします 初めて買ったPCのCPUは Duron 850MHz
(2000年ごろ) ハイエンドCPUが、ちょうど1GHzを越えたあたり ◦ PentiumⅢ1GHzとか、Athlon 1.2HGzとか このころは、「2010年には20GHzのCPUを実現」とか言ってた ◦ 同じように、Hyper-Threadingやマルチコアの「サーバ用途での」重要性も言われ始めた Intelはこの頃デスクトップ向けCPUでクロック周波数を向上させ続けていた ◦ プログラマにとっては、「フリーランチの時代」 しかし、2003年にクロック周波数の向上ペースは落ちてしまった ◦ 増え続ける発熱に対処できなくなった ◦ 2013年3月現在、x86向けCPUでの最高クロック周波数は4.2GHz ◦ フリーランチ時代の終焉・・・?
5.
CPUはデュアルコアへ 2005年に、Pentium4のダイを2つ搭載したPentium Dや、Athlon64のデュアルコア 版であるAthlon64 X2が登場 この頃から、「時代はマルチコア、メニーコアだ」と言われ始める
◦ 「2015年にはコアの数は100以上になる」 しかし、未だにデスクトップ向けCPUのコア数は最大8 ◦ メーカー製PCはいまだに4コアどころか、2コアのものも珍しくはない ◦ 「CPUメーカーはコア数を増やす方向にシフトした」のような記述は、半分正解で半分間違っ ているので、そういう記事・書籍は眉に唾をつけて読むこと クロック周波数も頭打ち、メニーコアも当分実現しそうにない・・・ CPUメーカーの怠慢?
6.
いやいや クロック周波数だけが性能を表すわけではない ◦ クロック周波数では測れない部分で、シングルスレッド性能は伸び続けている ◦ フリーランチはそれなりに継続中 一般的なPCの用途にメニーコアが必要とされていない ◦
現状、最重要なのはいまだにシングルスレッド性能 ◦ コアを増やしてもシングルスレッド性能は向上しない
7.
アムダールの法則
15% 並列化 並列化できない処理 できる 処理 50% 60% 並列化 できない 並列化できる処理 処理 50%
8.
現状の把握 並列化できない処理が支配的な現状、 マルチコアCPU・メニーコアCPUは作ったとしても買ってもらえない ◦ デスクトップPCではマルチコアCPU・メニーコアCPUへの移行は当分先(移行しない可能性も) これからは並列プログラミングが重要になる!という風潮について ◦ サーバサイドではそれこそ10年以上前から重要だった ◦
クライアントサイドではキラーアプリが作れていない現状、それほど重要ではないのでは? ◦ キラーアプリ作るのが使命なんだ!って人→応援したい ◦ 単純に楽しい!って人→すばらしい思う ◦ 将来のためにやっておこう、って人→いいと思う ◦ なんかそういう風潮だから・・・って人→いったん、立ち止まってみてもよいのでは? 「とはいっても、C#5.0から言語仕様にasync/awaitが追加されてますよ?」 ◦ よし、ではそのあたりから話をしよう
9.
今日話すこと 並列プログラミングと非同期プログラミング async/await以前の非同期プログラミング async/awaitの登場 async/await不要論 async/await必要論 そしてF#へ
10.
並列プログラミングと 非同期プログラミング
11.
マルチスレッド化の目的 マルチスレッド化する目的は、大きく分けて2つある 1. 複数のコアを活用し、処理を高速化する(並列プログラミング) 2. 処理をブロックさせないように、バックグラウンドで重い処理を走らせる
(非同期プログラミング) 前者は複数のコアがなければ意味がないが、後者は単一コアであっても意味がある ◦ ○ CPUがマルチコア・メニーコアに向かうから並列プログラミングは重要である ◦ × CPUがマルチコア・メニーコアに向かうから非同期プログラミングは重要である ◦ 非同期プログラミングの重要性を説くためにマルチコア化の流れを持ち出すのはおかしい 今日は、並列プログラミングではなく、非同期プログラミングの話をします
12.
非同期プログラミング 非同期プログラミングにも、大きく分けて2つの目的がある 1. 重い処理をバックグラウンドで走らせる 2. 非同期I/OによってI/Oの待ち時間を隠す 今日はこれらを実装する側というよりも、使う側視点 ◦
なのでどっちも同じようなものとして扱います 非同期コードを束ねたものを複数コアCPUで実行すると、並列動作する ◦ これを並列プログラミングと言っていいのかは・・・わかりません><
13.
async/await以前の 非同期プログラミング
14.
.NET Frameworkにおける 非同期プログラミングの移り変わり
4.5 4.0 TAP + async/await構文 2.0 TaskによるTAP (Task-based Asynchronous Pattern) 完了イベントによるEAP (Event-based Asynchronous Pattern) .NET Framework 1.1 Begin/EndによるAPM (Asynchronous Programming Model)
15.
各手法の比較のためのお題 2つのWebサービスから情報を取ってきて表示する ◦ ただし、WebサービスBから情報を取ってくるには、WebサービスAから取得した情報が必要 これを同期プログラミングで書くとこんな感じ でもこれだと、PrintSomeData
の処理が終わるまで、 呼び出し元をブロックしてしまう GetA や GetB を、AMP/EAP/TAPそれぞれで非同期にした場合に PrintSomeData がどうなるかを見てみましょう
16.
APM(非同期プログラミングモデル) BeginHoge メソッドに完了後の処理的なものを渡すスタイル
これでもだいぶマシになった方で、 .NET Framework1.1時代はラムダ式も無名デリゲー トもなかったので、これよりももっと地獄だった コールバック地獄 Begin に渡すのは完了後の処理ではない。対応する End を呼び出して完了する コールバックの引数を、正しく対応する End に渡す必要がある Begin に対応する End を呼ばないと、リソースリークの原因になる
17.
EAP(イベントベースの非同期プログラミングのデザインパターン) 完了イベントに完了後の処理を登録するスタイル
ここには出てこないけど、GetAAsyncとかの実装側 はそれはもう大変なコードが必要だった やっぱりコールバック地獄 HogeAsync を呼び出す前に完了後の処理を登録する必要があるため、 処理の記述の順番と実際の処理の順番が逆転している えっ、これAMPの方がマシじゃね・・・?
18.
TAP(タスクベースの非同期パターン) メソッドに完了後の処理を渡すスタイル
GetAAsyncの実装はタスクをStartNewするだけなので、 実装する側も使う側も労力が一番少ない (完了後の処理をGetAAsyncの引数としてではなく、 Taskクラスのメソッドに渡すようにしたのがGood) 結局コールバック地獄 でも一番すっきりしててわかりやすい
19.
各手法の比較 どれもコールバック地獄 APMは、ジェネリクスがなかった時代に戻り値の型を厳密に指定するために ああいうAPIになった。許す。 TAPは、ジェネリクスがある時代に作られた、APMの正当進化系。良い。 EAPは・・・どうしてそうなった。
20.
同期版とTAP版を比べてみる 同期版を機械的に変換して、非同期版が作れそう・・・!
21.
async/awaitの登場
22.
async/await APMにしてもEAPにしてもTAPにしても、コールバックの嵐だった コールバックによるプログラミングはネストも深くなり、見通しが悪い C#5.0から実装された async/await を使うと、同期版のように書かれたコードを
コンパイラが非同期版に変換してくれる コールバック地獄からの解放 ◦ 「垂直落下的なコード」て表現されてることもあるとおり、読みにくくない ◦ 逆に、これでどこがどう非同期で動くのかイメージしにくいかも?
23.
同期版と TAP+async/await版を比べてみる ほとんど同じ ◦ メソッド名の語尾がAsyncに(そういう慣例・規約) ◦ メソッドの先頭に
async がついている ◦ GetAAsync/GetBAsync の呼び出しの前に await がついている async/await、素晴らしいじゃないか・・・
24.
async/await不要論
25.
async/await再考(not 最高) async/await は確かに便利だけど、結局やっていることは構文の変換 ◦
ラムダ式のネストをフラットにしているだけ(実際は違うんだけど) 構文の変換といえば、C#にはクエリ式があるじゃない! クエリ式で書けそうじゃないですか?
26.
クエリ式 その名の通り、何らかのデータに対する「問い合わせ(クエリ)」を 言語組み込みの構文として用意したもの その名に反して、規定されたシグネチャに適合すれば データに対する問い合わせである必要はない ◦
以下の2つの関数があれば M<T> 型の式をクエリ式に組み込める ◦ M<T> 型の m と、Func<T, U> 型の f に対して、m.Select(f) の形で呼び出せる関数 ◦ M<T> 型の m と、Func<T, M<U>> 型の f と、Func<T, U, V> 型の g に対して、 m.SelectMany(f, g) の形で呼び出せる関数
27.
拡張メソッドで2つの関数を実装 Task<T> にインスタンスメソッドを後付けすることはできないので、拡張メソッドで
ContinueWith は F<Task<T>, U> を受け取って Task<U> を返すので、U が Task<V> だと、 Task<Task<V>> になってしまう Unwrap が Task<Task<T>> を Task<T> にしてくれる 効率とか異常系とか細かいことは、今回はパスで
28.
SelectManyは元のコードの構造を 写し取ったような構造をしている
29.
クエリ式で書いてみる async/await と同じことができた! async/await 版との違いは
◦ 通常のC#の文法ではなく、クエリ構文を使う ◦ 最後に全体を変数に格納する必要があるConsole.WriteLine が直接使えない (let で受けるか、上のように非同期化する) ◦ async が不要 ◦ 何か特殊なことをやっていると分かりやすい
30.
さらに APMをクエリ式で直接扱うようなSelect/SelectManyを実装できる ◦ APMをTAPに変換するのではなく、APMをAPMとしてクエリ式で扱える EAPもおそらくクエリ式で直接扱える・・・んじゃないかなぁ
◦ できなくてもTAPに変換すればTAPとしてクエリ式で扱える すべての非同期モデルを、 クエリ式という統一した構文で扱える! async/awaitなんていらんかったんや・・・
31.
async/await必要論
32.
クエリ構文 VS async/await構文
クエリ構文 async/await構文 メソッドの制約 なし asyncをつけ、戻り値も制限 式全体の型 Task<T> T 通常の構文との差 大 小 対応している制御構文 逐次と、条件演算子による分岐 逐次、分岐、繰り返し async/await は大体の制御構文と混ぜて記述できる(しかも型がT)のが大きい クエリ構文でこれは厳しい・・・
33.
やっぱりasync/awaitだよね! だがしかし。
catchで使えない! finallyで使えない!
34.
C#さんは 「こういう便利な機能追加したんですよ!」 「へぇ、すごい!」 「でもここでは使えないんですけどね!」 っての多すぎやしませんか!!! readonly で読み取り専用にできるけど、フィールドでしか使えない var で型を省略できるけど、ローカル変数でしか使えない yield
で簡単に IEnumerable<T> 作れるけど、ラムダ式の中では使えない async/await で簡単に非同期処理書けるけど、catch の中では使えない←New!
35.
個人的にはですね クエリ式にもっと頑張ってもらいたかった ◦ 名前からして、クエリ専用なことが明らか ◦ だけど仕組みはものすごい汎用性がある ◦
SQLみたいな感じだよー!とするにはつらい(JOINとかな!) 無理なものは仕方がない ◦ そこでF#ですよ!
36.
そしてF#へ
37.
F#のコンピュテーション式 F#には、C#のクエリ式のように「構文を変換する仕組み」として、 コンピュテーション式というものがある 「コンピュテーション(計算)」とあるように、とても汎用的な仕組み F#標準で、非同期ワークフローが扱える
38.
コンピュテーション式とクエリ式
コンピュテーション式 クエリ式 目的 計算一般 クエリ 構文 他の構文に近い 他の構文とは全く別 制御構文 順次、分岐、反復などに対応可能 順次と(制限のある)分岐のみ 他にも、F#は同名の変数により変数をシャドーイング(隠蔽)したり、アンダースコア によって値を捨てたりできる .NET Framework2.0移行であればF#の基本機能はすべて使える
39.
例外処理中の非同期処理だって C#は出来なかったけど、F#ならできちゃう
40.
それぞれの使い分け F#が使えるのであれば、F#を使う(.NET Frameworkのバージョンは問わない) そうではなく、C#5.0/.NET4.0以降が使えるのであれば、async/awaitを使う そうではなく、Taskが使えるのであれば、TAP +
クエリ式を使う(RXでも可?) そうではなく、C#3.0が使えるのであれば、APM + クエリ式を使う そうではなく、C#2.0が使えるのであれば、APMを無名デリゲートとともに使う C#1.2しか使えないのであれば、APMをメソッドとともに使うしか選択肢はない EAPは基本、使わない
41.
さいごに
42.
async/awaitの潜在能力? async/await は調査が全然足りてない もっと面白いことができる可能性もある ◦
async/awaitも、クエリ式同様「こういうシグネチャを持っていればいい」系 ◦ クエリ式をクエリ以外に使えるように、async/awaitも非同期処理以外に使えるかも・・・? そんなことしてると「ふつうのC#プログラム」からどんどん離れていきますけどね
43.
最後にこれだけは言いたい クエリ式はモナド用の構文! 異論は認めない!!!
Download