0

以下のように Task を使用しましたが、パフォーマンスは向上しません。0 ~ 1 秒で実行されるメソッドを確認しましたが、Task(30 Tasks) では 5 ~ 12 秒かかります。私が間違いを犯した場合、誰でもガイドできますか。30 を並列に実行し、最大 2 秒で 30 を実行したいと考えています。

これが私のコードです:

Task[] tasks = new Task[30];
for (int p = 0; p <= dstable.Tables[0].Rows.Count - 1; p++)
{
    MethodParameters newParameter = new MethodParameters();
    newParameter.Name = dstable.Tables[0].Rows[p]["Name"].ToString();

    tasks[p] = Task.Factory.StartNew(() => ParseUri(newParameter));
    Application.DoEvents();
}
try
{
    Task.WaitAll(tasks);
    //Console.Write("task completed");
}
catch (AggregateException ae)
{
    throw ae.Flatten();
}
4

2 に答える 2

8

あなたの考え方にはいくつかの大きな問題があります。

  1. あなたの PC には 30 個のコアがあり、すべてのコアが正確に 1 つのタスクを実行できますか? 私はそうは思わない
  2. 別のスレッドの開始にも時間がかかります。
  3. すべての同時スレッドで、より多くのオーバーヘッドが生成されます。
  4. より多くのスレッドを開始することで、問題をより迅速に解決できますか? これは、ディスクからの読み取り、データベースへのクエリ、何かの計算など、すべてのスレッドが異なるタスクを実行する場合にのみ当てはまります。CPU ですべての「高性能」タスクを実行する 10 個のスレッドでは、ブーストは得られません。すべてのスレッドは、次のスレッドに CPU 時間を与える前に、混乱をクリーンアップする必要があり、そのスレッドも混乱をクリーンアップする必要があるため、まったく逆です。

このリンクをチェックして ください http://msdn.microsoft.com/en-us/library/ms810437.aspx

TPL http://msdn.microsoft.com/en-us/library/dd460717.aspxを使用できます。

並列スレッドからの最大の効果を保証しようとします。また、この本をお勧めし ます http://www.amazon.com/The-Multiprocessor-Programming-Maurice-Herlihy/dp/0123705916

本当に 2 秒以内に問題を解決したい場合は、より多くの CPU パワーを購入してください ;)

于 2012-07-10T16:35:49.183 に答える
0

スレッドを使用する主なポイントを見逃している可能性があると思います。

  • 多くのスレッドを作成すると、OS のオーバーヘッドが増加し、複雑さが増す可能性があります。(コンテキスト切り替え)
  • また、コードの実行を管理するのがはるかに難しくなり、バグがあればそれを見つけて修正するのが難しくなります。

スレッドを使用すると有利になる場合があります。

  • タスクを同時に実行する必要がある
  • レスポンシブ UI の構築
于 2012-07-10T17:01:45.707 に答える