2017-07-27 16 views
2

アイテムのリストが長いアプリケーションを継承しました。スレッドを使用してプロセスを高速化する

これはループスルーに数時間かかったので、スレッドを実行して最適化できると思っていました。

例:私のforeachループにブレークポイントを設定すると、私はまだそれが終了する各項目を待つことに気づくが

 foreach (var d in data) 
     { 
      try 
      { 
       ExecutionMethodThread(d); 
      } 
      catch (Exception e) 
      { 

      } 

     } 

    private void ExecutionMethodThread(data d) 
    { 
     Thread thread = new Thread(() => MethodThread(d)); 
     thread.Start(); 
     thread.Join(); 

    } 

 foreach (var d in data) 
     { 
      try 
      { 
       // do alot of logic, takes time 
      } 
      catch (Exception e) 
      { 
       // catch error 

      } 

     } 

I iはによってそれを最適化することができると思っ前に移動する前に。 これはobviosly私はループを介して を実行するためにこのリストを期待して以来、私は望んでいないと私は自分のスレッドsimultanioslyを持つ複数のアイテムがあります。

どうすればよいですか?

明確化:

ループ1は、2の項目1を待たずに、スレッドとexecutsロジック

項目を開始し、独自のスレッドとexecuts ロジックなど

を取得

項目を開始します

+5

'Parallel.ForEach'。ロジックがスレッドセーフである必要があることに注意してください。 –

+1

あなたが扱うデータ内のすべてのアイテムについて、 'Join 'で計算が完了するのを待つので、同時に複数のアイテムを計算することはないので、マルチスレッドではありません – litelite

+0

@liteelite ? –

答えて

5

これには2つのループが必要です。最初のループでは、すべてのスレッドを作成して開始します。次に、2番目のループでは、すべてのスレッドが終了するのを待ちます。

var threads = new List<Thread>(); 
foreach (var d in data) 
{ 
    Thread thread = new Thread(() => new MethodThread(d)); 
    thread.Start(); 
    threads.Add(thread); 
} 

foreach (var thread in threads) 
{ 
    try 
    { 
     thread.Join(); 
    } 
    catch (Exception e) 
    { 
     // ... 
    } 
} 

ただし、このアプローチにはまだいくつかの欠点があります。処理するデータ項目が1万個ある場合はどうなりますか?すべてのスレッドが同時に実行できるわけではないにもかかわらず、データ項目ごとに1つのスレッドを作成します。つまり、不必要なリソースを消費します。

Parallel.ForEach(data, (datum) => 
{ 
    try 
    { 
     // Do your logic 
    } 
    catch (Exception e) 
    { 
     // ... 
    } 
}); 

C#は自動的にあなたのプロセッサ上で利用可能なコアの数と一致するように、スレッドの合理的な数を使用します。同じことを達成するための簡単な方法があります。

警告これは、ロジックがスレッドセーフであり、並列処理が可能であることを前提としています。 Parallel.Foreach()に切り替えるときや、ヘルパー関数からJoin()を移動するときには、非常に注意してください。

+0

私の好奇心は、@ Jeroem Mostertのタイプで "あなたのロジックはスレッドセーフである必要があることに注意してください" もし私がParallel.ForEachを使ってロジックスレッドを安全にするのであれば? – ThunD3eR

+0

@ Ra3IDeNデータが2つのスレッドによって同時に変更されていないことを確認してください。 –

+0

申し訳ありませんが、私はParallel.ForEachで早く退院します。いくつかのブレークポイントは決してヒットしませんが、コードがその目的地に決して到達しないと心配しています。私はすべてのエラーをキャッチし、eveyrhtingは問題ありませんが、ブレークポイントの一部は決してヒットしません。これを使用するときに私が紛失しているものは何ですか? – ThunD3eR

関連する問題