2012-01-19 7 views
2
foreach (int tranQuote in transactionIds) 
      { 
       CompassIntegration compass = new CompassIntegration(); 
       Chatham.Business.Objects.Transaction tran = compass.GetTransaction(tranQuote); 

       // then we want to send each trade through the PandaIntegration 
       // class with either buildSchedule, fillRates, calcPayments or 
       // a subset of the three 
       PandaIntegrationOperationsWrapper wrapper = new PandaIntegrationOperationsWrapper { buildSchedule = false, calcPayments = true, fillRates = true }; 
       new PandaIntegration().RecalculateSchedule(tran, wrapper); 

       // then we call to save the transaction through the BO 
       compass.SaveTransaction(tran); 
      } 

ここでは2行に非常に長い時間がかかります。 transactionIdsには私がこれを行う約18kのレコードがあります。パフォーマンスを向上させるためにループ内にスレッドをスクロールする

GetTransactionSaveTransactionは、最も時間がかかる2行ですが、正に、パフォーマンスを向上させるためにループ内で発生するものをスレッド化するのが好きです。

CPUなどの問題を起こさずにこれをスレッドするには、どのような方法が最適ですか?私は本当にどれくらいのスレッドが安全であるか、スレッドの管理方法やそのようなものについてはよく分かりません。

ありがとうございます。

答えて

3

TPLが必要なスロットリングと管理を提供しますを向上させるために重要ではありません場合は、パラレルのforeachを使用することができます。

Fx4以降が必要で、ループ内のすべてのコードはスレッドセーフでなければなりません。
GetTransactionとSaveTransactionが同時に呼び出されても安全かどうかは不明です。

+0

彼らはそうではないと言って、私は何をしなければならないだろうか? Henkに感謝します。 – slandau

+0

あなたはそれらをスレッドセーフにしなければならず、複雑になる可能性があります。しかし、それらはインスタンスごとのように見え、スレッドごとに新しいコンパスインスタンスがあります。だから私はあなたが大丈夫だと思う。 –

+0

ええと、.NETが何かを適切にキューイングする方法でビルドされていたかどうかわかりませんでしたが、一時停止するかw/eする前にスレッドでできることを実行していました。 – slandau

1

順序は、全体的なパフォーマンス

+0

秩序は問題ではありませんが、スレッドの量を指定する方法はありますか?安全なスレッド制限などがありますか? – slandau

+0

はい、スレッドの量を指定できます。どの部分をスレッドセーフにしたいですか? –

+0

@slandau - APIはCPUコア数などに基づいてスレッド数をスマートに選択しますが、それを上書きすることはできますが、めったに良い考えはありません。 –

3

GetTransactionとSaveTransactionは実際に何をすると遅くなるのですか?それがCPU上で動作しているなら、スレッディングは確かに役に立ちます。ディスクリプションやファイルI/Oを実行して遅い場合は、ディスクやデータベースを高速化するためにスレッドを実行することはありません。既に制約のあるリソースに複数の同時リクエストが送信されるため、実際には処理が遅くなる可能性があります。

関連する問題