質問

少なくとも .NET 4.0 のリリース以来、Microsoft は並列プログラミングと非同期プログラミングのサポートに多大な努力を払っているようで、これに関連する API やライブラリが多数登場しているようです。特に次のような派手な名前は、最近どこでも常に言及されています。

  • リアクティブフレームワーク、
  • PLINQ (並列 LINQ)、
  • TPL(タスク並列ライブラリ)と
  • 並列拡張機能。

現在、それらはすべて Microsoft 製品であるようで、すべて .NET の非同期または並列プログラミング シナリオをターゲットにしているようです。しかし、それぞれが実際に何であるか、そしてそれらが互いにどのように関連しているかは完全には明らかではありません。実際に同じものがあるかもしれません。

一言で言えば、何が何であるかを正確に記録できる人はいますか?

役に立ちましたか?

解決

PLINQ (並列Linq)は、単に新しい書通常のLinqクエリーな並列実行、すなわちこのフレームワークは自動的にケアの実行のクエリを複数のスレッドな仕上がりの速(複数の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は主として、 機能 スタイルのプログラミング no 側面、側面の効果をそのTPLするものとします。したい場合は、実際に はい 並列に対してだけで検索を選択すも並行して、ご利用のTPL.

のTPLであり、本質的に Parallel 授業公開の過度の負荷の For, Foreach, は、 Invoke. Invoke は、サンフランシスコ行列タスクの ThreadPool, が、少し簡単になります。IMOにより興味深いビットの ForForeach.このようにしていてビバップからハードバップファイルを圧縮す.きの定期的な時系列バージョン:

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 クラスではなく、本当について考えることのでマルチスレッディングの側面が隠れたからだを用意していますので、取り扱うコンプライアンス-


反応拡張 (Rx)も異なる獣。レコメンデーションとは異なり方を考えるイベント。が本当に多くの素材にこだの長い話を短く配線のイベントハンドラのイベントのRxき処理の配列のイベントとして...どの配列(IEnumerable<T>).く過程でのイベント反復ファッションに合わせて焚き非同期的にランダム回まで保存状態の検知のために、イベントが起きていることを特定する。

一番例がその場で発音を確認することがRxをは こちらの.スキップの"LinqをIObservable"が彼を実装するドラッグドロップハンドラは通常の痛みをコンポーネントのラインナップは、4つのラインのコードです。Rxす 構成 イベントらないって定期的にイベントハンドラ、コードスニペットをこのようなも簡単refactor入行動の授業できるスリーブなところです。


ことになるのです。これらの一部にクーラーの機能をご用意。純4.0の製品をご用意しています。がありますが、もちろん、これらっているんですけれども、これはいい!

他のヒント

私はアーロノートの答えが好きですが、Rx と TPL は異なる問題を解決すると思います。TPL チームが追加した内容の一部は、スレッド プリミティブと、ThreadPool などのランタイムの構成要素に対する大幅な機能強化です。そして、あなたがリストしたものはすべて、これらのプリミティブとランタイム機能の上に構築されています。

しかし、TPL と Rx は 2 つの異なる問題を解決します。TPL は、プログラムまたはアルゴリズムが「プル&キューイング」している場合に最適に機能します。Rx は、プログラムまたはアルゴリズムがストリームからのデータに「反応」する必要がある場合 (マウス入力や、WCF などのエンドポイントから関連メッセージのストリームを受信する場合など) に優れています。

ファイルシステムのような作業、コレクションの反復処理、または組織図のような階層の移動には、TPL の「作業単位」の概念が必要です。これらの各ケースにおいて、プログラマは全体の作業量を推論することができ、作業を特定のサイズのチャンク (タスク) に分割することができ、階層にわたって計算を実行する場合にはタスクを「連鎖」させることができます。 。したがって、特定の種類の作業は TPL の「タスク階層」モデルに適しており、キャンセルなどの配管機能の強化の恩恵を受けられます (CancelTokenSource に関するチャンネル 9 のビデオを参照)。TPL には、ほぼリアルタイムのデータ処理などの特殊なドメイン用のノブも多数あります。

Rx は、ほとんどの開発者が最終的に使用することになるでしょう。これは、WPF アプリケーションが外部データ (IM クライアントへの IM メッセージのストリーム) や外部入力 (Aaronaught からリンクされたマウス ドラッグの例など) などの外部メッセージに「反応」する方法です。内部では、Rx は TPL/BCL のスレッド プリミティブ、TPL/BCL のスレッドセーフ コレクション、ThreadPool などのランタイム オブジェクトを使用します。私の考えでは、Rx は意図を表現するための「最高レベル」のプログラミングです。

平均的な開発者が、Rx で表現できる一連の意図を理解できるかどうかは、まだわかりません。:)

しかし、今後数年でTPL対.Rx は、LINQ-to-SQL 対 SQL のような次の議論になるでしょう。エンティティフレームワーク。同じドメイン内に 2 つの種類の API があり、さまざまなシナリオに特化していますが、多くの点で重複しています。しかし、TPL と Rx の場合、実際には相互に認識されており、アプリケーションを構成して両方のフレームワークを一緒に使用するための組み込みアダプターがあります (PLINQ ループからの結果を IObservable Rx ストリームにフィードするなど)。並列プログラミングをまったくやったことがない人にとっては、スピードを得るためにたくさんのことを学ぶ必要があります。

アップデート:私は過去 6 か月間 (最初の回答から 18 か月間)、通常の仕事で TPL と RxNet の両方を使用してきました。中間層 WCF サービス (エンタープライズ LOB サービス) での TPL および/または RxNet の選択についての私の考えは次のとおりです。 http://yzorgsoft.blogspot.com/2011/09/middle-tier-tpl-andor-rxnet.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top