TPL
昨日Twitterで次のようなつぶやきを見かけました。よくよく考えてみれば、自分でもこれまで一度も並列処理中の進捗通知についてはやったことなかったです。ということで、とりあえずでやってみました。 ProgressBarの進捗がカオスwwwと思ったけども、Para…
.NET Framework 4.0で搭載されたタスク並列ライブラリについての連載インデックス
落ち穂拾いも第4回です。今回はC# 5.0(仮)で搭載予定の、より簡易な非同期プログラミングについて見ていきます。今回の内容はこの記事を書いている段階でのものであり、正式リリース時には変更される可能性がありますので注意してください。 C#の進化 これま…
Hokuriku.NET C# -TPL入門-での資料を公開します。参加した方々は復習に利用してください。また、参加されていない方々も、Ustreamの録画を見ながら一緒にハンズオンができますので、是非利用してください。たった数時間でTPLを習得するチャンスです! Power…
落ち穂拾いがこんなに続くなんておかしな話ですが、第3回です。今回は処理時間の長いタスクの明示についてです。 処理時間の長いタスク スレッドプールに登録されたタスクの実行時間が非常に長い場合、それはワーカースレッドを長い間専有することになります…
落ち穂拾いの第2回の今回はスレッドプールの挙動について見ていきます。TPLは既定の設定のほぼすべてで内部的にスレッドプールが利用されています。つまり、スレッドプールはTPLの要と言っても過言ではありません。スレッドプールの内部実装は.NET Framework…
「TPL入門(16) - おわりに」で終わったはずの連載ですが、あれから読んだ記事にまだまだいろいろ書いてあったので、"落ち穂拾い" という形でもうしばらく紹介したいと思います。 落ち穂拾い第1回の今回は、TPLが出現する前までの並列処理の書き方についてで…
ここまで15回に渡ってTPLについて見てきました。個人的に勉強したことの備忘録でしかありませんが、読まれた方々が少しでもTPLについて興味を持ってくださったり、理解を深めるキッカケになっていれば幸いです。 しばらくTPLに触れてきて実感したことは、非…
GUIアプリケーションを作成していると、非同期処理の前後や実行中にボタンなどのUIコンポーネントを制御したいと思うことは多々あると思います。しかし、Windows Forms、WPFなどでは、UIスレッド以外のスレッドから直接UIコンポーネントを操作することは認め…
タスクは、生成の開始からタスクスケジューラーへの登録、タスクの実行、完了など、自身のライフサイクルが現在どのような状態にあるかを事細かに把握しています。また、タスクインスタンス毎に割り当てられる一意のIDも保持しています。今回は、これらタス…
今回はタスクをキャンセルする方法について見ていきます。以前ループの取り消しでも触れましたが、.NET Framework 4ではキャンセルトークンを用いた統一的なキャンセル手法が提供されています。そして、タスクもそれを使ってキャンセルできるようにサポート…
プログラムを作成するにあたっては、発生し得る例外というものを十分に考慮しなければなりません。しかしながら、非同期処理/並列処理の場合は例外処理がやりにくいのも実情です。特にタスクは呼び出し元スレッドとは非同期に実行されるので、その中で発生し…
タスク内で別のタスクを作成/実行するという、入れ子のタスクを作ることができます。また、タスクに親子関係を持たせることも可能です。今回はこれらについて見ていきたいと思います。 入れ子タスク 入れ子タスクを作るのに何か特別な作業が必要かというと、…
あるタスクが完了したあと、連続して別のタスクを実行したい場合があります。このとき、まず思い付くのは「最初に実行したタスクAを待機して、それから別のタスクBを開始する」でしょう。しかし、これでは結局呼び出し元スレッドをブロックすることになり、…
アプリケーションによっては、呼び出し元スレッドでタスクが完了するのを待ち合わせなければならないケースがあります。また、実行していたタスクから結果を受け取り、それに応じて処理を分けたい場合もあります。言うまでもなく、TPLにはこのようなニーズに…
前回まではデータの並列化 (= コレクションの各要素の並列処理) について見てきましたが、今回からはタスクの並列化 (= 他の処理とは独立に実行可能な作業の並列処理) について見ていきます。 タスクの概要 これまで、非同期処理/並列処理を行う際にはThread…
今回は並列処理のループの取り消しの方法について見ていきます。 通常のfor/foreach文のようなループ処理にユーザーによる任意タイミングでのキャンセルを行いたい場合があるように、並列ループにもそのようなニーズがあることは自明なことと思います。.NET …
今回は並列処理中に発生した例外の扱い方について見ていきます。 TPLの例外 通常例外処理をする場合、特に何も意識することなく発生するであろう例外の型をcatchに書くでしょう。しかし処理が並列に実行されているとなると、同時に複数の例外が発生する可能…
今回はスレッドローカル変数を利用したパフォーマンス向上について見ていきます。 スレッドローカル変数の必要性 例えば、とある数値コレクションの値を合計したいとします。通常のfor/foreach文のループを用いて合計する場合は、何も気にすることなくひとつ…
今回は並列ループを中断/停止する方法について見ていきます。 通常のfor/foreach文はbreakでループをエスケープすることができるのはご承知の通りと思いますが、残念ながらParallel.For/ForEachの中ではそれができません。for/foreach文はれっきとしたループ…
並列実行時にCPUがどのように動いているのか、今回はその挙動をもう少し視覚的に確認していきます。 CPU使用率を確認 下記のサンプルコードはfor文とParallel.For文の中で長いループ処理をしているだけの簡単なものです。それぞれの経過時間の測定も行ってい…
今回はコレクション要素に対して同様の処理を並列に行う方法について考えます。そのシナリオをサポートするために、TPLではSystem.Threading.Tasks名前空間に並列実行可能なFor/ForEach文が提供されています。 Parallel.ForEach 最も簡単なParallel.ForEach…
近年のCPUの進化はクロック数を上げる方向ではなく、複数コアを載せる方向に進んでいます。1コアの処理速度を上げることに対する限界が来ているからです。コアを複数にすることで並列に処理を行えるようにし、全体としての処理速度を改善しようというのが狙…