2010-11-24 28 views
-6

.NETでスレッドの「もの」について議論したいと思います。 他の言語/フレームワークでは非同期呼び出しの処理方法が明確に限定されていますが、.NETでこれを行うには無数の方法があります。 私がここでやろうとしているのは、ある種の「事例のベストプラクティス」を定義しようとすることです。言い換えれば、いつどのトレッドアプローチを使用しますか?Discussion:.NETでのスレッディング

我々は我々のコード実行中の非同期を得ることができますどのような方法の列挙で始めることができます:

  • スレッド(新しいスレッド)
  • のThreadPool(ThreadPool.QueueUserWorkItem)
  • のBackgroundWorker(BackgroundWorker.RunWorkerAsync)
  • デリゲート(Delegate.BeginInvoke)
  • タスクのParallelsライブラリ
  • パラレルクラス(パラレル。 foreachの)


[Iは、任意のを忘れてしまったのか?]

をここで私が使用してどのようなタイプを決定する方法である:
スレッド - 通常、私はスレッドを完全に制御する必要がある、例えばサービスのメインスレッド。
のThreadPool - 高い優先度を持っていない短いタスク - UIプロジェクト - - >積載私たちはUIにIPCを接続していると私はちょうどlosenこれらの呼び出しは、UI
BackgroundWorkerのをブロックしないようにする必要があると言うことができます/スプラッシュ画面
委任は - 私は私のUIスレッド(ディスパッチャ/フォーム.Invoke)
タスクのParallelsライブラリと同期する必要があるusaually場合にのみ - まだ使用されていない、私は、デリゲートの道」のためにその偉大な交換を推測します"UIを同期させるため
パーallel - 複数のオブジェクトにいくつかのコードを実行する必要がある場合。別のサーバーからのメールのコレクションを持っているので、私はそれぞれのサーバーで何かする必要があります。

ここでは、どのように使用するかを決めるのですか?

このディスカッションがうまくいけば、セマフォトピックも追加したいと思います。

スレッド:あなたはすべてのスレッドIDEAL数を処理できることを十分に快適に感じるここ

+3

よくある質問で書かれているように、Q/Aではディスカッションできません。残念ながら、そうではありませんが、それはその方法です... –

+0

コミュニティWiki !?また、.NET 5の非同期キーワードについて議論したいかもしれません。 – mnemosyn

+0

これはFAQでもWikiでもありません(まだ)。これまで私は私の個人的な経験を追加しました。私は、このような感覚的な話題をwikiに配置するためのいくつかのより多くの入力を楽しみにしていました。 – Jaster

答えて

2

は私の2セントです。これはほとんど常にそうではありません。 REALスレッドが.NETスレッドプールではないと叫ぶ人がいると聞いています。あなたはこの質問をしたくない場合:Optimal number of threads per coreスレッドで行かないでください。

ThreadPool:これは最適なスレッド数のためのボックスソリューションの.net答えでした。しかしAPIは最高ではありませんでした。新しいプロジェクトではTPLを使用します。

BackgroundWorker:簡単なポストバックでGUIアプリケーションからのスレッドを開始したい場合。これにより、最もシンプルなAPIが提供されます。

ディスパッチャー:あなたが言ったように。ちょうどGUIスレッドに戻るためです。それはそのために不可欠です。とにかく私が知らないいくつかのあいまいなコードなしでそれを使うことができる他の方法はありません。
注:デリゲートとは呼ばれません。デリゲートはディスパッチするためにディスパッチャに渡すものです。

タスク並列ライブラリ:これは.netに付属しています。4.新しいプロジェクトに使用することをお勧めします。

パラレル:これは間違っています。 Parallel.Forはループ全体が完了するまで制御を返しません。あなたがやりたいことがループを並行して実行するだけのときに便利です。入力を出力にマッピングするのに最適です(例:x - > x * 2)。 Parallel.For(またはForEach)を使用すると、これを複数のスレッドで実行することができます(また、数値は.NETによって決定されます)。チェックアウト:http://www.lovethedot.net/2009/02/parallelfor-deeper-dive-parallel.html