Enviar pesquisa
Carregar
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
•
3 gostaram
•
4,967 visualizações
Tusyoshi Matsuzaki
Seguir
Tecnologia
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 23
Recomendados
An other world awaits you
An other world awaits you
信之 岩永
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
Gosuke Miyashita
ドメイン駆動設計入門
ドメイン駆動設計入門
Takuya Kitamura
go generate 完全入門
go generate 完全入門
yaegashi
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
Shigenori Sagawa
Recomendados
An other world awaits you
An other world awaits you
信之 岩永
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
Gosuke Miyashita
ドメイン駆動設計入門
ドメイン駆動設計入門
Takuya Kitamura
go generate 完全入門
go generate 完全入門
yaegashi
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
Shigenori Sagawa
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
例外設計における大罪
例外設計における大罪
Takuto Wada
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
C#とILとネイティブと
C#とILとネイティブと
信之 岩永
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
テストコードの DRY と DAMP
テストコードの DRY と DAMP
Yusuke Kagata
TRICK 2022 Results
TRICK 2022 Results
mametter
あなたはPO?PM?PdM?PjM?
あなたはPO?PM?PdM?PjM?
大貴 蜂須賀
Git超入門_座学編.pdf
Git超入門_座学編.pdf
憲昭 村田
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
SEGADevTech
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
暗号技術の実装と数学
暗号技術の実装と数学
MITSUNARI Shigeo
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
Unity Technologies Japan K.K.
Easybuggy(バグ)の召し上がり方
Easybuggy(バグ)の召し上がり方
広平 田村
Flutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたもの
Recruit Lifestyle Co., Ltd.
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
非同期処理の基礎
非同期処理の基礎
信之 岩永
よりよい開発を目指すための、プロセス&ツール活用
よりよい開発を目指すための、プロセス&ツール活用
Kaoru NAKAMURA
Mais conteúdo relacionado
Mais procurados
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
例外設計における大罪
例外設計における大罪
Takuto Wada
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
C#とILとネイティブと
C#とILとネイティブと
信之 岩永
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
テストコードの DRY と DAMP
テストコードの DRY と DAMP
Yusuke Kagata
TRICK 2022 Results
TRICK 2022 Results
mametter
あなたはPO?PM?PdM?PjM?
あなたはPO?PM?PdM?PjM?
大貴 蜂須賀
Git超入門_座学編.pdf
Git超入門_座学編.pdf
憲昭 村田
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
SEGADevTech
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
暗号技術の実装と数学
暗号技術の実装と数学
MITSUNARI Shigeo
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
Unity Technologies Japan K.K.
Easybuggy(バグ)の召し上がり方
Easybuggy(バグ)の召し上がり方
広平 田村
Flutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたもの
Recruit Lifestyle Co., Ltd.
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
Mais procurados
(20)
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
例外設計における大罪
例外設計における大罪
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
C#とILとネイティブと
C#とILとネイティブと
オブジェクト指向できていますか?
オブジェクト指向できていますか?
テストコードの DRY と DAMP
テストコードの DRY と DAMP
TRICK 2022 Results
TRICK 2022 Results
あなたはPO?PM?PdM?PjM?
あなたはPO?PM?PdM?PjM?
Git超入門_座学編.pdf
Git超入門_座学編.pdf
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
暗号技術の実装と数学
暗号技術の実装と数学
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
Easybuggy(バグ)の召し上がり方
Easybuggy(バグ)の召し上がり方
Flutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたもの
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
Destaque
非同期処理の基礎
非同期処理の基礎
信之 岩永
よりよい開発を目指すための、プロセス&ツール活用
よりよい開発を目指すための、プロセス&ツール活用
Kaoru NAKAMURA
50分で掴み取る ASP.NET Web API パターン&テクニック
50分で掴み取る ASP.NET Web API パターン&テクニック
miso- soup3
Build Insider OFFLINE vol.01 スマートフォンサイトのこれから ~ レスポンシブ・Webデザインは救世主となり得るか
Build Insider OFFLINE vol.01 スマートフォンサイトのこれから ~ レスポンシブ・Webデザインは救世主となり得るか
H2O Space. Co., Ltd.
Beachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JIT
Kouji Matsui
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Masahiro Wakame
スケーラビリティと耐障害性を両立するWeb アプリケーション
スケーラビリティと耐障害性を両立するWeb アプリケーション
Masayoshi Hagiwara
HttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴について
Yoshifumi Kawai
スマホ向けWebアプリ開発で使えるフロントエンド高速化手法
スマホ向けWebアプリ開発で使えるフロントエンド高速化手法
Eiji Kodama
Destaque
(9)
非同期処理の基礎
非同期処理の基礎
よりよい開発を目指すための、プロセス&ツール活用
よりよい開発を目指すための、プロセス&ツール活用
50分で掴み取る ASP.NET Web API パターン&テクニック
50分で掴み取る ASP.NET Web API パターン&テクニック
Build Insider OFFLINE vol.01 スマートフォンサイトのこれから ~ レスポンシブ・Webデザインは救世主となり得るか
Build Insider OFFLINE vol.01 スマートフォンサイトのこれから ~ レスポンシブ・Webデザインは救世主となり得るか
Beachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JIT
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
スケーラビリティと耐障害性を両立するWeb アプリケーション
スケーラビリティと耐障害性を両立するWeb アプリケーション
HttpClient詳解、或いは非同期の落とし穴について
HttpClient詳解、或いは非同期の落とし穴について
スマホ向けWebアプリ開発で使えるフロントエンド高速化手法
スマホ向けWebアプリ開発で使えるフロントエンド高速化手法
Semelhante a .NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
Em synchrony について
Em synchrony について
Tomoya Kawanishi
OpenStack + Common Lisp
OpenStack + Common Lisp
irix_jp
HTML5&API総まくり
HTML5&API総まくり
Shumpei Shiraishi
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単に
Yoshifumi Kawai
20010901
20010901
小野 修司
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
OSvの概要と実装
OSvの概要と実装
Takuya ASADA
Terraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as Code
Takahisa Iwamoto
Web API(Dynamics 365 )勉強会
Web API(Dynamics 365 )勉強会
Kazuya Sugimoto
Lightweight-Stream-APIのあるAndroidアプリ開発
Lightweight-Stream-APIのあるAndroidアプリ開発
Shinobu Okano
20121217 jawsug-yokohama
20121217 jawsug-yokohama
Tetsuya Chiba
複数アプリケーションのプロセスとログを管理するための新しいツールと手法
複数アプリケーションのプロセスとログを管理するための新しいツールと手法
Masaki Yatsu
Node.jsでブラウザメッセンジャー
Node.jsでブラウザメッセンジャー
Yahoo!デベロッパーネットワーク
東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates
koichik
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming Paradigm
Minero Aoki
Ext.directことはじめ
Ext.directことはじめ
Shuhei Aoyama
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
Shigeo Ueda
実践 Reactive Extensions
実践 Reactive Extensions
Shin Ise
Node-v0.12の新機能について
Node-v0.12の新機能について
shigeki_ohtsu
Semelhante a .NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
(20)
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
Em synchrony について
Em synchrony について
OpenStack + Common Lisp
OpenStack + Common Lisp
HTML5&API総まくり
HTML5&API総まくり
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単に
20010901
20010901
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
OSvの概要と実装
OSvの概要と実装
Terraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as Code
Web API(Dynamics 365 )勉強会
Web API(Dynamics 365 )勉強会
Lightweight-Stream-APIのあるAndroidアプリ開発
Lightweight-Stream-APIのあるAndroidアプリ開発
20121217 jawsug-yokohama
20121217 jawsug-yokohama
複数アプリケーションのプロセスとログを管理するための新しいツールと手法
複数アプリケーションのプロセスとログを管理するための新しいツールと手法
Node.jsでブラウザメッセンジャー
Node.jsでブラウザメッセンジャー
東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming Paradigm
Ext.directことはじめ
Ext.directことはじめ
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
実践 Reactive Extensions
実践 Reactive Extensions
Node-v0.12の新機能について
Node-v0.12の新機能について
Mais de Tusyoshi Matsuzaki
Apache Spark on Azure
Apache Spark on Azure
Tusyoshi Matsuzaki
Minecraft による強化学習の実践 (MineRL)
Minecraft による強化学習の実践 (MineRL)
Tusyoshi Matsuzaki
Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理
Tusyoshi Matsuzaki
クラウドの潮流と Windows Azure の位置づけ (エフスタ Tokyo 資料)
クラウドの潮流と Windows Azure の位置づけ (エフスタ Tokyo 資料)
Tusyoshi Matsuzaki
アイデンティティ プロバイダーとの連携手法 Tsmatsuz
アイデンティティ プロバイダーとの連携手法 Tsmatsuz
Tusyoshi Matsuzaki
SharePoint 2010 を使ったクラウドアプリ開発
SharePoint 2010 を使ったクラウドアプリ開発
Tusyoshi Matsuzaki
Mais de Tusyoshi Matsuzaki
(6)
Apache Spark on Azure
Apache Spark on Azure
Minecraft による強化学習の実践 (MineRL)
Minecraft による強化学習の実践 (MineRL)
Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理
クラウドの潮流と Windows Azure の位置づけ (エフスタ Tokyo 資料)
クラウドの潮流と Windows Azure の位置づけ (エフスタ Tokyo 資料)
アイデンティティ プロバイダーとの連携手法 Tsmatsuz
アイデンティティ プロバイダーとの連携手法 Tsmatsuz
SharePoint 2010 を使ったクラウドアプリ開発
SharePoint 2010 を使ったクラウドアプリ開発
Último
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
sugiuralab
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
Último
(8)
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
1.
.NET Web プログラミングにおける 非同期
I/O のすべて 日本マイクロソフト株式会社 エバンジェリスト 松崎 剛 http://blogs.msdn.com/b/tsmatsuz
2.
2 セッション ゴール • .NET
Web 開発における非同期 IO の基本を学ぶ 発想の原点や歴史、基本メカニズム、用語などについて • べし・べからず、Tips、などを理解 新機能にはワケがある ! ~ スケーラブルな Web を作ろう ~
3.
3 非同期のプログラミング・パターン • EAP (Event-based
Asynchronous Pattern) • APM (Asynchronous Programming Model) • TAP (Task-based Asynchronous Pattern) FileStream fs; byte[] readArray = new byte[0x1000]; . . . fs.BeginRead(readArray, 0, readArray.Length, new AsyncCallback(readCallback), fs); . . . private void readCallback(IAsyncResult ar) { System.IO.FileStream fs = (System.IO.FileStream)ar.AsyncState; int fsize = fs.EndRead(ar); . . . } MyReadClass myRead = new MyReadClass(); myRead.ReadCompleted += new EventHandler<ReadCompletedEventArgs>( readCompleted); myRead.ReadAsync(); . . . private void readCompleted( object sender, ReadCompletedEventArgs e) { var res = e.Result; . . . } using (StreamReader reader = File.OpenText(filename)) { result = new char[reader.BaseStream.Length]; Task<int> t = reader.ReadAsync(result, 0, (int) reader.BaseStream.Length); }
4.
4 ASP.NET における非同期の変遷 ASP.NET Web
フォーム ASP.NET MVC .NET 2.0 .NET 3.5 .NET 4.5 .NET 4.0
5.
5 プログラミング・パターンの相性 protected void Page_Load(object
sender, EventArgs e) { if (!IsPostBack) { this.PreRenderComplete += new EventHandler(Page_PreRenderComplete); AddOnPreRenderCompleteAsync( new BeginEventHandler(BeginAsyncOperation), new EndEventHandler(EndAsyncOperation)); } } IAsyncResult BeginAsyncOperation(object sender, EventArgs e, AsyncCallback cb, object state) { _connection = new SqlConnection(connectstring); _connection.Open(); _command = new SqlCommand( "SELECT title_id, title, price FROM titles", _connection); return _command.BeginExecuteReader(cb, state); } void EndAsyncOperation(IAsyncResult ar) { _reader = _command.EndExecuteReader(ar); } protected void Page_PreRenderComplete(object sender, EventArgs e) { Output.DataSource = _reader; Output.DataBind(); } ASP.NET Async Page (APM) + DB Access (APM)
6.
6 TAP + async/await
(C# 5.0) public Task<ActionResult> Test1() { // Step 1 HttpClient cl = new HttpClient(); Task<HttpResponseMessage> task = cl.GetAsync(@"http://heavyweb.cloudapp.net/"); return task.ContinueWith(t => { // Step 2 ViewBag.ResultData = t.Result.ToString(); return (ActionResult)View(); }); } public async Task<ActionResult> Test1() { // Step 1 HttpClient cl = new HttpClient(); HttpResponseMessage result = await cl.GetAsync(@"http://heavyweb.cloudapp.net/"); // Step 2 ViewBag.ResultData = result.ToString(); return (ActionResult)View(); }
7.
7 ASP.NET における非同期 要求 (Request)、キュー
(Queue)、スレッド (Thread) Web サーバー (IIS) 要求 (Request) キュー (Queue) 処理中 … 処理中 … 処理中 … スレッド (Thread) スレッド プール
8.
8 ASP.NET における非同期 同期のケース お医者さん = スレッド (Thread) 患者さん = 要求
(Request) 受付 = キュー (Queue)
9.
9 ASP.NET における非同期 同期のケース
10.
10 ASP.NET における非同期 同期のケース 空くのを待機 .
. .
11.
11 ASP.NET における非同期 非同期のケース
12.
12 ASP.NET における非同期 非同期のケース
13.
13 ASP.NET における非同期 非同期のケース
14.
14 I/O Completion Port
(IOCP) • Windows が提供する機構 • 1 つの IOCP は、1 つ以上のデバイス ハンドル (ファイル ハンドルな ど) と関連 • キューのメカニズムを使って、非同期 IO の完了をプログラムから検知 • スレッドの状態 (待ち状態、リリース状態、など) を監視し、スレッド の実行数を自動で制御 • IOCP でブロックされたスレッドは、いったん解放されて、LIFO の キューに入る (1 つのスレッドが継続して処理可能。可能な限り Context Switch を抑制) • Win32 API を提供 • カスタムな制御が可能 • Thread Pool API を使った I/O 処理、Timer処理 (Thread Pool Timer) で使用
15.
15 15
16.
16 16 public class
Handler1 : IHttpHandler { public void ProcessRequest(HttpContext context) { if (context.IsWebSocketRequest) { BetsHandler1 handler = new BetsHandler1(); context.AcceptWebSocketRequest(handler.Receive); } else { context.Response.StatusCode = 400; //bad request } } . . . } public class BetsHandler1 { public WebSocket webSocket; public async Task Receive( AspNetWebSocketContext context) { webSocket = context.WebSocket; ArraySegment<byte> buf = new ArraySegment<byte>(new byte[2048]); while (true) { WebSocketReceiveResult res = await webSocket.ReceiveAsync( buf, System.Threading.CancellationToken.None); if (res.MessageType == WebSocketMessageType.Close) { // Close Message connectedHandlers.Remove(this); await webSocket.CloseOutputAsync( . . .); break; } else if (res.MessageType == WebSocketMessageType.Text) { // Text Message . . . Some kind of process } } } . . . }
17.
17 17 public class
Handler1 : IHttpHandler { public void ProcessRequest(HttpContext context) { if (context.IsWebSocketRequest) { BetsHandler1 handler = new BetsHandler1(); context.AcceptWebSocketRequest(handler.Receive); } else { context.Response.StatusCode = 400; //bad request } } . . . } public class BetsHandler1 { public WebSocket webSocket; public Task Receive( AspNetWebSocketContext context) { webSocket = context.WebSocket; ArraySegment<byte> buf = new ArraySegment<byte>(new byte[2048]); while (true) { WebSocketReceiveResult res = webSocket.ReceiveAsync( buf, System.Threading.CancellationToken.None); if (res.MessageType == WebSocketMessageType.Close) { // Close Message connectedHandlers.Remove(this); webSocket.CloseOutputAsync( . . .); break; } else if (res.MessageType == WebSocketMessageType.Text) { // Text Message . . . Some kind of process } } return new TaskFactory().StartNew(() => { }); } . . . }
18.
18 .NET 4.5 Web
の TAP 対応 (“呼ぶ” 側) • ASP.NET Web フォーム • ASP.NET Web API • WCF • WebSocket . . . protected void Page_Load(object sender, EventArgs e) { Page.RegisterAsyncTask(new PageAsyncTask(async () => { HttpClient cl = new HttpClient(); HttpResponseMessage res = await cl.GetAsync(@“http://.../"); Label1.Text = res.ToString(); })); } public class Service1 : IService1 { public async Task<string> GetDataAsync() { HttpClient cl = new HttpClient(); HttpResponseMessage res = await cl.GetAsync(@“http://.../"); return res.ToString(); } } public class ValuesController : ApiController { // GET api/values public async Task<string> Get() { HttpClient cl = new HttpClient(); HttpResponseMessage res = await cl.GetAsync(@"http://.../"); return res.ToString(); } } context.AcceptWebSocketRequest(handler.Receive); . . . public async Task Receive(AspNetWebSocketContext context) { while (true) { WebSocketReceiveResult res = await context.WebSocket.ReceiveAsync(. . .); . . . } }
19.
19 IO リソースの TAP
対応 (“呼ばれる” 側) ファイル入出力 .NET 4.5 で TAP (async) のメソッド (ReadAsync, WriteAsync, CopyToAsync など) を提供 (これまでは、APM のみ) データ ベース ADO.NET .NET 4.5 で TAP (async) のメソッド (ReadAsync など) を提供 (これまでは、APM のみ) Entity Framework Entity Framework 6 で、TAP (async) をサポート (現在、ベータ版を提供) ネット ワーク REST HttpClient のメソッドは、基本的に TAP ベース WCF .NET 4.5 で自動生成される Service Refrence Proxy では、TAP (async) のメソッドを提供 クラウド Windows Azure ServiceBus 最新の WindowsAzure.ServiceBus パッケージ (NuGet) で TAP の メソッド (NamespaceManager.QueueExistsAsync など) を提供 (APM も使用可能) では、未対応のものはどうする ? (例 : WCF Data Services, Windows Azure Storage など) ますます、対応中 . . . (こうご期待!)
20.
20 SynchronizationContext • スレッド間の関係を管理する抽象化されたスケジューラー・オブジェクト ASP.NET
非同期スレッドは、Win32 メッセージ ループのように特定スレッドに紐づかない • 1 つのスレッドに対し、必ず 1 つの SynchronizationContext が存在 (ただし、単一 のSynchronizationContext は複数スレッドで共有) • 一部の実装 (override メソッド) を除き、具体的な実装は派生クラスに依存 WindowsFormsSynchronizationContext DispatcherSynchronizationContext AspNetSynchronizationContext 既定の SynchronizationContext • これまでの非同期処理 (EAP など) において、その動作をつかさどる • TAP では TaskScheduler を使用 (SynchronizationContext を使用する際は、 TaskScheduler.FromCurrentSynchronizationContext を明示)
21.
21 SynchronizationContext • 既定の Awaiter
(TaskAwaiter) は、Current の SynchronizationContext を使用 (なければ TaskScheduler も参照) AspNetSynchronizationContext では、同期ブロックに入れるスレッドは 1 つだけ • .NET 4 以降では、Task と相性の良い新しい AspNetSynchronizationContext を使用 従来のものは LegacyAspNetSynchronizationContext に変更 この場合でも、Web.configの設定で新しいContextを 使用可能 <appSettings> <add key="aspnet:UseTaskFriendlySynchronizationContext“ value="true"/> </appSettings>
22.
22 混ぜるな、危険 💀 • Async
(EAP, TAP, etc) と Sync の混 在プログラムは、デッドロックの原因 となる ! Task で受け取った内容を、むりやり同期 化しない (All async is beautiful !) 「扱いやすい」(理解しやすい) という理 由だけで、 Result、Wait を多用しない (初心者にありがちなミス) 現実の開発では、追跡とデバッグが非常に 困難 (例 : 単一では動作するんだけ ど ?、コンソール・アプリでは動くのに ? など)