PLINQ(Parallel Linq)は、通常のLinqクエリを記述して並列実行するための新しい方法です。つまり、Frameworkは複数のスレッド間でクエリを自動的に実行し、より高速に終了します(つまり、複数のCPUコアを使用します)。 )。
たとえば、文字列がたくさんあり、文字「A」で始まるすべての文字列を取得したいとします。次のようにクエリを記述できます。
var words = new[] { "Apple", "Banana", "Coconut", "Anvil" };
var myWords = words.Select(s => s.StartsWith("A"));
そして、これはうまくいきます。ただし、検索する単語が50,000語ある場合は、各テストが独立しているという事実を利用して、これを複数のコアに分割することをお勧めします。
var myWords = words.AsParallel().Select(s => s.StartsWith("A"));
通常のクエリを複数のコアで実行される並列クエリに変換するために必要なのはこれだけです。かなりきちんと。
TPL(タスク並列ライブラリ)はPLINQを補完するものであり、これらが一緒になって並列拡張機能を構成します。PLINQは主に副作用のない機能的なプログラミングスタイルに基づいていますが、副作用はまさにTPLの目的です。単に並行して検索/選択するのではなく、実際に並行して作業を行いたい場合は、TPLを使用します。
TPLは基本的に、、、およびのParallel
オーバーロードを公開するクラスです。 のタスクをキューに入れるのと少し似ていますが、使用するのが少し簡単です。IMO、より興味深いビットはとです。たとえば、圧縮したいファイルがたくさんあるとしましょう。通常のシーケンシャルバージョンを作成できます。For
Foreach
Invoke
Invoke
ThreadPool
For
Foreach
string[] fileNames = (...);
foreach (string fileName in fileNames)
{
byte[] data = File.ReadAllBytes(fileName);
byte[] compressedData = Compress(data);
string outputFileName = Path.ChangeExtension(fileName, ".zip");
File.WriteAllBytes(outputFileName, compressedData);
}
この場合も、この圧縮の各反復は、他の反復から完全に独立しています。それらのいくつかを一度に実行することで、これをスピードアップできます。
Parallel.ForEach(fileNames, fileName =>
{
byte[] data = File.ReadAllBytes(fileName);
byte[] compressedData = Compress(data);
string outputFileName = Path.ChangeExtension(fileName, ".zip");
File.WriteAllBytes(outputFileName, compressedData);
});
繰り返しになりますが、この操作を並列化するために必要なのはこれだけです。これで、メソッド(またはメソッドと呼ぶことにしたもの)を実行するCompressFiles
と、複数のCPUコアが使用され、おそらく半分または1/4の時間で終了します。
ThreadPool
すべてをチャックするだけでなく、これが実際に同期して実行されることの利点があります。ThreadPool
代わりに(または単なるインスタンス)を使用Thread
した場合、すべてのタスクがいつ終了したかを確認する方法を考え出す必要があります。これはそれほど複雑ではありませんが、多くの人が傾向があるものです。失敗するか、少なくとも問題が発生します。クラスを使用するときは、Parallel
実際にそれについて考える必要はありません。マルチスレッドの側面はあなたから隠されており、すべて舞台裏で処理されます。
Reactive Extensions(Rx)は、実際にはまったく別の獣です。これは、イベント処理についての別の考え方です。これについてカバーする資料は本当にたくさんありますが、長い話を短くするために、イベントハンドラーをイベントに接続する代わりに、Rxではイベントのシーケンスを...まあ、シーケンス(IEnumerable<T>
)として扱うことができます。イベントをランダムに非同期で発生させるのではなく、反復的に処理することができます。特定の順序で発生する一連のイベントを検出するには、常に状態を保存し続ける必要があります。
私が見つけたRxの最もクールな例の1つはここにあります。「LinqtoIObservable」セクションにスキップして、ドラッグアンドドロップハンドラーを実装します。これは通常、WPFでは面倒ですが、わずか4行のコードで実行できます。Rxは、通常のイベントハンドラーでは実際には得られないイベントの構成を提供します。また、このようなコードスニペットは、どこにでも配置できる動作クラスにリファクタリングするのも簡単です。
以上です。これらは、.NET4.0で利用できるより優れた機能の一部です。もちろん、他にもいくつかありますが、これらはあなたが尋ねたものでした!