xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

2011-01-01から1年間の記事一覧

Rx入門 (8) - LINQスタイルでの記述

Rx

今回はRxの特徴のひとつであるLINQスタイルでの記述について触れてみます。みんな大好きなLINQ、これができると世界がまた変わります。 情報伝播のイメージ 今回はLINQの中でも特に基本的なWhere/Select文を取り上げてみます。前回の「山から湧き出る水」イ…

Rx入門 (7) - IObservable<T>の生成

Rx

「Rx入門 (4) - IObserver<T>の省略」では、受信側であるIObserver<T>を省略した書き方について取り上げました。その記事の冒頭で「送信側はさておき...」と送信側のことは棚に上げていましたが、そうは言ってもやはり送信側もIObservable<T>をいちいち実装するのは手</t></t></t>…

Rx入門 (6) - Subject<T>の亜種

Rx

前回は、Rxの動作確認などを楽にしてくれるSubject<T>について触れました。今回はこれの亜種を紹介します。 ReplaySubject<T> ひとつ目はReplaySubject<T>です。ReplaySubject<T>は、OnNextが呼び出されたときに値を通知すると同時にその値をキャッシュします。新たにSub</t></t></t></t>…

Rx入門 (5) - Subject<T>の利用

Rx

前回はIObserver<T>の生成を隠蔽し、より簡略化した記法を学びました。今回はさらにIObservable<T>も簡略化してみます。 一人二役のSubject<T> Rxのライブラリ (System.Reactive.dll) にあるSystem.Reactive.Subjects名前空間の中に、Subject<T>というクラスがあります。</t></t></t></t>…

Rx入門 (4) - IObserver<T>の省略

Rx

前々回のオブザーバーパターンの例では、IObservable<T>とIObserver<T>の具象クラスをそれぞれ実装しました。しかし、送信側はさておき、挙動が変わりやすい受信側がいちいちIObserver<T>を実装するのは現実的ではありません。そこで今回は、IObserver<T>の省略について</t></t></t></t>…

Rx入門 (3) - Push型とPull型

Rx

今回はPush型とPull型の考え方について見ていきます。Push/Pullと言われても何のこっちゃですが、データの流れ方のことです。 Push型 Push型配信の典型的な例に、携帯電話のキャリアメールがあります。携帯電話が定期的にサーバーにメールを確認しに行くので…

Rx入門 (2) - オブザーバーパターン

Rx

Rxの根幹となる考え方はオブザーバーパターンです。まずはこのオブザーバーパターンについて見て行きます。 オブザーバーパターンの概要 オブジェクト指向プログラミングにおいては、「あるオブジェクトが変化したとき、その変更に合わせて他のオブジェクト…

Rx入門 (1) - はじめに

Rx

近年のアプリケーションの高度化は凄まじいものがあります。ユーザーはその進化にどんどん慣れていき、より新しいもの、かっこいいもの、快適なものを求めるようになります。特に "快適" というのは非常に重要な要素で、使っていてストレスの溜まるようなア…

Hokuriku.NET vol.8 資料

Hokuriku.NET vol.8のLTで喋らせて頂いたときの資料を公開します。準備不足でミスってたところがあったので、ちょこっとだけ手直ししてあります。興味を持たれた方は、内容は大したことないですが覗いてみてください。基本的にはTPL入門(21) - 非同期メソッ…

TPL入門 (20) - 非同期メソッド

TPL

落ち穂拾いも第4回です。今回はC# 5.0(仮)で搭載予定の、より簡易な非同期プログラミングについて見ていきます。今回の内容はこの記事を書いている段階でのものであり、正式リリース時には変更される可能性がありますので注意してください。 C#の進化 これま…

Hokuriku.NET C# -TPL入門- 資料

Hokuriku.NET C# -TPL入門-での資料を公開します。参加した方々は復習に利用してください。また、参加されていない方々も、Ustreamの録画を見ながら一緒にハンズオンができますので、是非利用してください。たった数時間でTPLを習得するチャンスです! Power…

TPL入門 (19) - 長いタスクの明示

TPL

落ち穂拾いがこんなに続くなんておかしな話ですが、第3回です。今回は処理時間の長いタスクの明示についてです。 処理時間の長いタスク スレッドプールに登録されたタスクの実行時間が非常に長い場合、それはワーカースレッドを長い間専有することになります…

TPL入門 (18) - スレッドプールの挙動

TPL

落ち穂拾いの第2回の今回はスレッドプールの挙動について見ていきます。TPLは既定の設定のほぼすべてで内部的にスレッドプールが利用されています。つまり、スレッドプールはTPLの要と言っても過言ではありません。スレッドプールの内部実装は.NET Framework…

TPL入門 (17) - 以前の並列処理

TPL

「TPL入門(16) - おわりに」で終わったはずの連載ですが、あれから読んだ記事にまだまだいろいろ書いてあったので、"落ち穂拾い" という形でもうしばらく紹介したいと思います。 落ち穂拾い第1回の今回は、TPLが出現する前までの並列処理の書き方についてで…

TPL入門 (16) - おわりに

TPL

ここまで15回に渡ってTPLについて見てきました。個人的に勉強したことの備忘録でしかありませんが、読まれた方々が少しでもTPLについて興味を持ってくださったり、理解を深めるキッカケになっていれば幸いです。 しばらくTPLに触れてきて実感したことは、非…

TPL入門 (15) - UIコンポーネントの操作

TPL

GUIアプリケーションを作成していると、非同期処理の前後や実行中にボタンなどのUIコンポーネントを制御したいと思うことは多々あると思います。しかし、Windows Forms、WPFなどでは、UIスレッド以外のスレッドから直接UIコンポーネントを操作することは認め…

TPL入門 (14) - タスクの状態

TPL

タスクは、生成の開始からタスクスケジューラーへの登録、タスクの実行、完了など、自身のライフサイクルが現在どのような状態にあるかを事細かに把握しています。また、タスクインスタンス毎に割り当てられる一意のIDも保持しています。今回は、これらタス…

TPL入門 (13) - タスクのキャンセル

TPL

今回はタスクをキャンセルする方法について見ていきます。以前ループの取り消しでも触れましたが、.NET Framework 4ではキャンセルトークンを用いた統一的なキャンセル手法が提供されています。そして、タスクもそれを使ってキャンセルできるようにサポート…

TPL入門 (12) - タスクの例外処理

TPL

プログラムを作成するにあたっては、発生し得る例外というものを十分に考慮しなければなりません。しかしながら、非同期処理/並列処理の場合は例外処理がやりにくいのも実情です。特にタスクは呼び出し元スレッドとは非同期に実行されるので、その中で発生し…

TPL入門 (11) - 入れ子タスクと子タスク

TPL

タスク内で別のタスクを作成/実行するという、入れ子のタスクを作ることができます。また、タスクに親子関係を持たせることも可能です。今回はこれらについて見ていきたいと思います。 入れ子タスク 入れ子タスクを作るのに何か特別な作業が必要かというと、…

TPL入門 (10) - タスクの継続

TPL

あるタスクが完了したあと、連続して別のタスクを実行したい場合があります。このとき、まず思い付くのは「最初に実行したタスクAを待機して、それから別のタスクBを開始する」でしょう。しかし、これでは結局呼び出し元スレッドをブロックすることになり、…

TPL入門 (9) - 完了の待機と結果の取得

TPL

アプリケーションによっては、呼び出し元スレッドでタスクが完了するのを待ち合わせなければならないケースがあります。また、実行していたタスクから結果を受け取り、それに応じて処理を分けたい場合もあります。言うまでもなく、TPLにはこのようなニーズに…

TPL入門 (8) - タスクの実行

TPL

前回まではデータの並列化 (= コレクションの各要素の並列処理) について見てきましたが、今回からはタスクの並列化 (= 他の処理とは独立に実行可能な作業の並列処理) について見ていきます。 タスクの概要 これまで、非同期処理/並列処理を行う際にはThread…

TPL入門 (7) - ループの取り消し

TPL

今回は並列処理のループの取り消しの方法について見ていきます。 通常のfor/foreach文のようなループ処理にユーザーによる任意タイミングでのキャンセルを行いたい場合があるように、並列ループにもそのようなニーズがあることは自明なことと思います。.NET …

TPL入門 (6) - 例外処理

TPL

今回は並列処理中に発生した例外の扱い方について見ていきます。 TPLの例外 通常例外処理をする場合、特に何も意識することなく発生するであろう例外の型をcatchに書くでしょう。しかし処理が並列に実行されているとなると、同時に複数の例外が発生する可能…

TPL入門 (5) - スレッドローカル変数

TPL

今回はスレッドローカル変数を利用したパフォーマンス向上について見ていきます。 スレッドローカル変数の必要性 例えば、とある数値コレクションの値を合計したいとします。通常のfor/foreach文のループを用いて合計する場合は、何も気にすることなくひとつ…

TPL入門 (4) - ループの中断/停止

TPL

今回は並列ループを中断/停止する方法について見ていきます。 通常のfor/foreach文はbreakでループをエスケープすることができるのはご承知の通りと思いますが、残念ながらParallel.For/ForEachの中ではそれができません。for/foreach文はれっきとしたループ…

TPL入門 (3) - 挙動の観察

TPL

並列実行時にCPUがどのように動いているのか、今回はその挙動をもう少し視覚的に確認していきます。 CPU使用率を確認 下記のサンプルコードはfor文とParallel.For文の中で長いループ処理をしているだけの簡単なものです。それぞれの経過時間の測定も行ってい…

TPL入門 (2) - 単純なループ

TPL

今回はコレクション要素に対して同様の処理を並列に行う方法について考えます。そのシナリオをサポートするために、TPLではSystem.Threading.Tasks名前空間に並列実行可能なFor/ForEach文が提供されています。 Parallel.ForEach 最も簡単なParallel.ForEach…

TPL入門 (1) - はじめに

TPL

近年のCPUの進化はクロック数を上げる方向ではなく、複数コアを載せる方向に進んでいます。1コアの処理速度を上げることに対する限界が来ているからです。コアを複数にすることで並列に処理を行えるようにし、全体としての処理速度を改善しようというのが狙…