Home
Explore
Submit Search
Upload
Login
Signup
Advertisement
実践 Reactive Extensions
Report
Shin Ise
Follow
Sep. 1, 2011
•
0 likes
2 likes
×
Be the first to like this
Show More
•
1,489 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Check these out next
.NETからActive Directoryデータにアクセス ~ユーザ情報の取得と表示~
Michio Koyama
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
Shinsuke Sugaya
Startup JavaScript
Akinari Tsugo
Webサーバ勉強会 (160-162:?)
Yuuki Namikawa
MongoDBざっくり解説
知教 本間
Elasticsearchベースの全文検索システムFess
Shinsuke Sugaya
Elasticsearch at CrowdWorks
佑介 九岡
elasticsearchソースコードを読みはじめてみた
furandon_pig
1
of
23
Top clipped slide
実践 Reactive Extensions
Sep. 1, 2011
•
0 likes
2 likes
×
Be the first to like this
Show More
•
1,489 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Download Now
Download to read offline
Report
Technology
Shin Ise
Follow
Advertisement
Advertisement
Advertisement
Recommended
Solr 4.0 の主な機能
Shinichiro Abe
8K views
•
20 slides
Wpfと非同期
yone64
8.7K views
•
20 slides
Nginx
Soichi Takamura
986 views
•
49 slides
Cocoa勉強会#6-SQLiteをCocoaで使う
Masayuki Nii
959 views
•
4 slides
Elasticsearchで作る形態素解析サーバ
Shinsuke Sugaya
7K views
•
22 slides
Apache ManifoldCF
Shinichiro Abe
2.8K views
•
13 slides
More Related Content
Slideshows for you
(20)
.NETからActive Directoryデータにアクセス ~ユーザ情報の取得と表示~
Michio Koyama
•
10.1K views
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
Shinsuke Sugaya
•
2.7K views
Startup JavaScript
Akinari Tsugo
•
530 views
Webサーバ勉強会 (160-162:?)
Yuuki Namikawa
•
640 views
MongoDBざっくり解説
知教 本間
•
3.6K views
Elasticsearchベースの全文検索システムFess
Shinsuke Sugaya
•
7.5K views
Elasticsearch at CrowdWorks
佑介 九岡
•
12.2K views
elasticsearchソースコードを読みはじめてみた
furandon_pig
•
7.6K views
Elasticsearchプラグインの作り方
Shinsuke Sugaya
•
14.6K views
Fluentd+elasticsearch+kibana(fluentd編)
Daisuke Kikuchi
•
3.4K views
Asp.net web forms_log4net
Naoyuki Sano
•
339 views
.NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~
Michio Koyama
•
1.4K views
RとSQLiteで気軽にデータベース作成
弘毅 露崎
•
10.1K views
PowerShell 小技集
sakuragi yuuto
•
2K views
Presto As A Service - Treasure DataでのPresto運用事例
Taro L. Saito
•
9.8K views
.NETからActive Directoryにアクセス
Michio Koyama
•
4.8K views
Elasticsearchの基本動作まとめ
朋哉 池田
•
325 views
Sc2009autumn s2robot
Shinsuke Sugaya
•
2.7K views
本当にあった怖い話し (やきに駆動 2.0)
Oda Shinsuke
•
2K views
データベースのお話
Hidekazu Tanaka
•
3.2K views
Similar to 実践 Reactive Extensions
(20)
Reactive Extensionsで非同期処理を簡単に
Yoshifumi Kawai
•
14.7K views
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
•
30K views
20071204
小野 修司
•
389 views
Java EE8 Report
Norito Agetsuma
•
8.2K views
[東京] JapanSharePointGroup 勉強会 #2
Atsuo Yamasaki
•
2.8K views
Tech Fielders 2009/9/18 LT
terurou
•
1.5K views
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
Shumpei Shiraishi
•
4.2K views
20160121 データサイエンティスト協会 木曜セミナー #5
Koichiro Sasaki
•
4.7K views
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京
Koichiro Sasaki
•
6.4K views
RxSwift x APIKit
Kosuke Usami
•
3.5K views
Seasarプロジェクト徹底攻略
takezoe
•
5.2K views
ホット・トピック・セミナー「Metro」
Kohsuke Kawaguchi
•
805 views
20080524
小野 修司
•
1.2K views
Jjug springセッション
Yuichi Hasegawa
•
2.6K views
linq.js - Linq to Objects for JavaScript
Yoshifumi Kawai
•
11.8K views
Ext.direct
Shuhei Aoyama
•
1.2K views
20080201
小野 修司
•
429 views
2012 02-02 mixi engineer's seminor #3
Yu Ishikawa
•
1K views
AWS SDK for Haskell開発
Nomura Yusuke
•
2.4K views
20120721_ishkawa
Yosuke Ishikawa
•
1.1K views
Advertisement
More from Shin Ise
(20)
Cross platform development with Xamarin 2.0 + MvvmCross
Shin Ise
•
2.6K views
いまどきのiOSプログラミング with Xcode5
Shin Ise
•
9.1K views
すまべんLite@関西#4
Shin Ise
•
1.1K views
すまべんLite@関西#3
Shin Ise
•
1.2K views
すまべんLite@関西#2
Shin Ise
•
902 views
すごいHaskell読書会#10
Shin Ise
•
1.6K views
音声APIを使ってみる
Shin Ise
•
1.8K views
すまべんLite@関西#1
Shin Ise
•
1.4K views
Xamarin2.0であそぼう
Shin Ise
•
1.8K views
CoreBluetoothでつくるBluetooth Low Energyデバイス
Shin Ise
•
25K views
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
Shin Ise
•
1.5K views
GridViewのつかいかた
Shin Ise
•
1.3K views
iOSのVoiceOver対応開発 Rev2
Shin Ise
•
1.6K views
MediaLibrary で あそぼう
Shin Ise
•
614 views
本当は怖いSilverlight for Windows Phone Toolkit
Shin Ise
•
660 views
Socketプログラム Silverlight for Windows Phoneへの移植のポイント
Shin Ise
•
705 views
Macで使うWindows Phone 7
Shin Ise
•
987 views
iOSのVoiceOver対応開発
Shin Ise
•
5.8K views
Galaxy tab で持ち歩くモバイルサーバー
Shin Ise
•
1.5K views
ハブインテグレーションでWindows Phone 7の世界に溶け込むアプリを作る
Shin Ise
•
907 views
Recently uploaded
(20)
☀️【卡尔顿大学毕业证成绩单留学生首选】
15sad
•
2 views
統計学の攻略_統計的仮説検定の9パターン.pdf
akipii Oga
•
133 views
統計学の攻略_正規分布ファミリーの全体像.pdf
akipii Oga
•
133 views
初学者のためのプロンプトエンジニアリング実践.pptx
Akifumi Niida
•
376 views
統計学の攻略_推測統計学の考え方.pdf
akipii Oga
•
138 views
JSTQB_テストマネジメントとレビュープロセス.pdf
akipii Oga
•
113 views
通信プロトコルについて
iPride Co., Ltd.
•
0 views
20230523_IoTLT_vol99_kitazaki_v1.pdf
Ayachika Kitazaki
•
107 views
①【阳光海岸大学毕业证文凭学位证书|工艺完美复刻】
vgh215w
•
2 views
Forguncy製品概要.pptx
フォーガンシー
•
0 views
SoftwareControl.pdf
ssusercd9928
•
6 views
社内ソフトスキルを考える
infinite_loop
•
40 views
Kubernetes超入門
Takashi Suzuki
•
5 views
①【戴尔豪斯大学毕业证文凭学位证书|工艺完美复刻】
love445ds
•
2 views
ヘッドレス化したbaserCMS5とその機能
Ryuji Egashira
•
10 views
TestSIP (1).pdf
DeependraSingh712859
•
2 views
Oracle Cloud Infrastructure:2023年5月度サービス・アップデート
オラクルエンジニア通信
•
29 views
Üslup ve tercüme.pdf
1Hmmtks
•
2 views
モバイル・クラウド・コンピューティング-データを如何に格納し、組み合わせ、情報として引き出すか
Masahiko Funaki
•
2 views
Windows ChatGPT Bing AI.pptx
Atomu Hidaka
•
2 views
Advertisement
実践 Reactive Extensions
実践 Reactive Extensions
2011/08/27 Silverlight/Phone Quest I 伊勢 シン (Microsoft MVP for Windows Phone)
自己紹介 • 伊勢 シン
– Microsoft MVP for Windows Phone (Oct 2010-Sep 2011) • 大阪で働くスマートフォンプログラマ – 目指すは「スマートフォンの万屋」 – iOSアプリをビルドをしながらAndroidアプリのコーディングやったりとか – Windows Phone 7 も少々 • 趣味もスマートフォンアプリ開発で – EbIRC – SongTweeter • コミュニティ – スマートフォン勉強会 代表 – Windows Phone Arch 関西スタッフ?
おしながき • Reactive Extension
について – 基本的なこと – 書き方の考え方 • 実例でみるReactive Extensions – RSSの取得 – ログインが必要なページの先からファイルダウンロード – 複数ページをダウンロードして一括処理 – なんでもいいからとにかく非同期
Reactive Extensions について
そもそもReactive Extensionsって何ぞ • Reactive
Extensions (Rx) • LINQの機能を時間軸に拡張するライブラリ – LINQ to SQL, LINQ to Objects に対する LINQ to Events, LINQ to Asynchronous – “WhereでフィルタしてSelectで射影できるならLINQ といえる” – by @neuecc
なにがうれしいの? • 複雑な非同期処理を「直線的に」書ける –
非同期のコードはひたすらネストがつづく – “もはやカオスすぎて頭が痛い” by @neuecc • 例外処理をひとまとめに書ける – Subscribeの第2引数のラムダで一括処理可能 • その他各種特典 – 中断処理も簡単。 – リトライ処理 – 処理の待ち合わせ、結合など
“もはやカオスすぎて頭が痛い” 例
そう、Rxならね WebRequest.Create("http://hoge")
.GetResponseAsObservable() .Select(res => new StreamReader(res.GetResponseStream()).ReadToEnd()) .SelectMany(s => WebRequest.Create(s).GetResponseAsObservable()) .Select(res => new StreamReader(res.GetResponseStream()).ReadToEnd()) .ObserveOnDispatcher() .Subscribe( s => MessageBox.Show(s), e => MessageBox.Show(e.ToString()));
どこでつかえるの? • Windows Phone
のクラスライブラリに 標準搭載され、非同期処理しか存在しない Silverlight の存在も相まって注目度アップ • WP7だけでなく、いろいろなところでつかえます – .NET Framework 3.5 / 4 Client Profile – Silverlight 3 / 4 / for Windows Phone – XNA 3.1(Zune) / 4 (Xbox360) – http://www.microsoft.com/download/en/details .aspx?id=24940
どうやって使うの?@WP7 • 以下のアセンブリを参照 –
Microsoft.Phone.Reactive – System.Observable • Rxを使いたいcsファイルのusingに以下を追加 – Microsoft.Phone.Reactive • すべてのはじまりは Observable クラス
そもそもマルチスレッドの基本的な考え方 UIスレッド
トリガー UI反映 スレッド同期 どこか別のスレッド 時間のかかる処理 結果の処理
Rx コードの基本構成
1.トリガー Observable.FromAsyncPattern<WebResponse>( req.BeginGetResponse, req.EndGetResponse)() .Select(res => XDocument.Load(res.GetResponseStream())) .SelectMany(doc => doc.Element("Categories").Elements("Category")) .Select(elem => new { ID = elem.Element("ID").Value, 2.データ処理 Name = elem.Element("Name").Value }) .ObserveOnDispatcher() 3.スレッド同期 .Subscribe(res => { // UI反映 }, err => { // 例外処理 4.UI反映 });
簡単にRxを書くために • 通信処理系のRxを書くなら
RxAsynchronousHelper を使うと便利です。 – 通信を非同期に行うためのRxのおきまり処理を うまくパッケージングしたクラス。あるだけで便利。 – by @neuecc – http://neue.cc/2010/11/26_286.html
実例で見る Reactive Extensionsの使い方
RSSを受信する • 単純な処理の例 –
XDocumentの名前空間つけないといけないのだけ なんとかならんかと思っています。
単純なRSS受信 private
const string Name_RDF = "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}RDF"; private const string Name_Item = "{http://purl.org/rss/1.0/}item"; private const string Name_Title = "{http://purl.org/rss/1.0/}title"; private const string Name_Link = "{http://purl.org/rss/1.0/}link"; var req = WebRequest.CreateHttp("http://d.hatena.ne.jp/iseebi/rss"); Observable.FromAsyncPattern<WebResponse>(req.BeginGetResponse, req.EndGetResponse)() .Select(res => XDocument.Load(res.GetResponseStream())) .Select(doc => from elem in doc.Element(Name_RDF).Elements(Name_Item) select new { Title = elem.Element(Name_Title).Value, Link = elem.Element(Name_Link).Value }) .ObserveOnDispatcher() .Subscribe(res => { foreach (var item in res) { Debug.WriteLine("{0} -> {1}", item.Title, item.Link); } });
RxAsynchronousHelperを使った場合 WebRequest.CreateHttp("http://d.hatena.ne.jp/iseebi/rss")
.GetResponseAsObservable() .Select(res => XDocument.Load(res.GetResponseStream())) .Select(doc => from elem in doc.Element(Name_RDF).Elements(Name_Item) select new { Title = elem.Element(Name_Title).Value, Link = elem.Element(Name_Link).Value }) .ObserveOnDispatcher() .Subscribe(res => { foreach (var item in res) { Debug.WriteLine("{0} -> {1}", item.Title, item.Link); } });
ダウンロードの結果解析で次のファイルへ • ログインが必要なページなどに有効 • SelectManyにすれば、流れに全く関係のない
IObservable<T> を新規にメソッドチェーンに 流せる。
テキストに書いてあるURLをさらに取得 // URLが書いてある WebRequest.CreateHttp("http://iseebi.half-done.net/test/url.txt")
.DownloadStringAsync() // 新しいIObservableを流す .SelectMany(res => WebRequest.CreateHttp(res).DownloadStringAsync()) .ObserveOnDispatcher() .Subscribe(res => { Debug.WriteLine(res); });
一括ダウンロードしてから処理 • 複数のファイルをダウンロードし、
ダウンロード完了後に処理したい場合 – 定義ファイルの一括取得など
一括ダウンロード // ダウンロード処理を一括でリストにする var l
= new List<IObservable<string>>() { WebRequest.CreateHttp("http://iseebi.half-done.net/test/phone.txt").DownloadStringAsync(), WebRequest.CreateHttp("http://iseebi.half-done.net/test/clientappdev.txt").DownloadStringAsync(), WebRequest.CreateHttp("http://iseebi.half-done.net/test/deviceappdev.txt").DownloadStringAsync(), WebRequest.CreateHttp("http://iseebi.half-done.net/test/powershell.txt").DownloadStringAsync(), }; // ForkJoinで一括処理 Observable.ForkJoin(l) .ObserveOnDispatcher() .Subscribe(res => { foreach (var item in res) { Debug.WriteLine(item); } });
なんでもいいからとにかく非同期に • とにかくなんでもいいので非同期にしたい場合、
以下の組み合わせで何もないところから処理を 作り出せる。 – Observable.Defer – Observable.ToAsync Observable.Defer(Observable.ToAsync(() => System.Threading.Thread.Sleep(3000))) .ObserveOnDispatcher() .Subscribe(res => Debug.WriteLine("Success!!!"));
まとめ • Rx 使うと非同期処理が
きれい、かんたん、便利に書けます。 – いくつかの実例をみてご紹介しました。 • Special thanks to @neuecc
Advertisement