2012-04-16 15 views
2

私はそれに144アイテムがあるキューを持っています。各キュー要素は要求です。私は並行してコードを実行しようとすることで処理のパフォーマンスを向上させようとしています。私はperformaction(request)メソッドを呼び出します。オブジェクトをインスタンス化し、そのオブジェクトに要求を渡してアクションを実行します。これらのリクエストは独立しており、リクエストのアクション結果もお互いに独立しているため、このアクションは並行して実行できます。 最初に試しましたParallel.Invoke対タスクなぜexceution時間が異なるのですか?

foreach(var request in queue.Values) 
    Parallel.Invoke(() =>PerformAction(request); 

私は同じforeachを試しました。

var task = new Task(() => PerformAction(request)); 
task.Start(); 

とタスクを完了するために、ほとんど0.005sを取っている間、実行プログラムparallel.invokeが完了するまでに約3秒かかったときはforeachの外に、私は

Task.WaitAll(); 

を持っています。私は、次の質問を持っている

は:

  1. は、パラレルのinvokeタスクよりも時間がかかったのはなぜ?並列呼び出しは、私が望むように並列モードで実行されなかったようです。
  2. 私はタスクを使用しているときに、私は新しいタスクを作成していますが、1000リクエストのリクエストがあれば、1000スレッドを作成したり、CPUが必要に応じてスレッドを作成しますか?
  3. Task.WaitAll()は、プログラムが終了する前にすべてのタスクが完了するのを待つでしょうか?

答えて

9

コードの問題は、Task.WaitAll()が意図したとおりに動作しないことです。あなたは保存され、タスクを開始しました:

var task = new Task(() => PerformAction(request)); 
task.Start(); 

をしかし、あなたはWaitAllに渡す各タスクへの参照を保持していません。すべてのタスクを配列に保存してから、その配列をWaitAllに渡すことになります。したがって、タスクが完了するのを待っているわけではないので、あなたのプログラムはタスクで「高速」に実行されます。

ご質問:

  1. Parallel.Invokeはより多くの時間がかかった理由については上記を参照してください - それは実際に実行されるため。しかし、あなたもそれを正しく使用していません。 Parallel.Invokeは一連のアクション(Actions[])を受け取り、すべてを並行して実行しようとします。そのたびに1回のアクションで複数回コールしています。私はあなたのコードがどのようにコンパイルされるのかは分かりません。私が何をしたいことはあると信じて:あなたは、要求ごとに新しいタスクを作成している

    Parallel.ForEach(queue.Values, request => PerformAction(request)) 
    
  2. 、それは糸で一から一をマップしません。既定では、タスクはthe thread poolを使用します。

  3. Task.WaitAll(tasks)tasksがすべて終了するまで待機します。しかし、あなたが何かを渡さなければそれはありません。繰り返しますが、これをコンパイルする必要はありません。

+0

申し訳ありません、はい私はTaskWaitAllにList of TasksをArrayに変換しました。 – Nair

+0

メソッドは 'Task.WaitAll(params Task [] tasks)'(http://msdn.microsoft.com/en-us/library/dd270695)として定義されています。aspx)ので、 'Task.WaitAll()'は空の 'Task []'配列を待つ(予期せず)正当なC#コードです。 (実際には、OPが持っていたコードではありませんでしたが)。 –

+0

@BradleyGraingerはい、これは私の間違いでした。一旦変換して配列リストを追加すると、正しく動作しました。 – Nair

関連する問題