2016-08-18 9 views
0

私はデスクトッププログラムでビジネスロジックを処理しています。処理速度を上げるためにWebサービスでマルチスレッド化

しかし、大きなデータで処理するとデータ処理がひどく遅くなります(MS SQLデータベースを使用しています)。それで、私は回避策を講じます。

`

DataTable dtEmp = new DataTable("Employee"); 

    if (cn.State == ConnectionState.Closed) 
    { 
     cn.Open(); 
    } 

    using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sEmpQuery, cn)) 
    { 
     Console.Write(string.Format("Command Text:{0}", sEmpQuery)); 
     cmd.Parameters.AddWithValue("Period", sPeriod); 
     dtEmp.Load(cmd.ExecuteReader()); 
    } 

    if (cn.State == ConnectionState.Open) 
    { 
     cn.Close(); 
    } 

    Int32 iThread; 
    iThread = iNoThread; 

    Int32 iCountTable; 
    iCountTable = dtEmp.Rows.Count; 
    Console.WriteLine(string.Format("Total Rows:{0}", iCountTable)); 

    Int32 IProcNum; 
    IProcNum = iCountTable/iThread; 
    Console.WriteLine(string.Format("Transaction no:{0}", IProcNum)); 


    if (iCountTable < iThread) 
    { 
     Boolean bl; 

     AutoHRPay.frmClosePeriod aPay= new AutoHRPay.frmClosePeriod(); 

     MiscResource AMisc = new MiscResource(); 
     MiscResource misc = new MiscResource(); 

     misc.SetDBConn(strCN); 


    } 
    else 
    { 
     Boolean[] bl = new Boolean[iThread]; 

     object locker = new object(); 

     Parallel.For(1, iThread + 1, i => 
     { 
      System.Text.StringBuilder strSQL = new System.Text.StringBuilder(); 
      strSQL.Append("("); 

      DataTable dtEmpThread = dtEmp.Clone(); 
      dtEmpThread.Clear(); 

      for (Int32 j = ((i - 1) * IProcNum + 1); j <= ((i != iThread) ? (IProcNum * i) : iCountTable); j++) 
      { 
       dtEmpThread.ImportRow(dtEmp.Rows[j-1]); 
      } 



      int row_counter = 0; 

      lock (locker) 
      { 
       row_counter++; 
       streamwriter.WriteLine("Processing row: {0}", row_counter); 
      } 


      ConsoleAttn aPay = new ConsoleAttn(); 

      aPay.runConsole(); 

     }); 


    } 
    streamwriter.Close(); 
    return "Completed."; 
:私は以下のコードのように過去ログTask.Parallelのtechonologyと、いくつかのスレッドに処理を分ける、その後、)(Webサービスプロジェクトを開き、およびDLL名consoleAttnに私のビジネスロジックプロセスをパッケージ化

1)プロセスを停止する必要があるとき、またはWebサービスを呼び出したクライアントが崩壊するときに、非同期プロセスをどのように行うべきですか?

答えて

0

役立つかもしれないいくつかのアプローチは、DataTableののクローンを作成しないでください

  • 巨大なのDataTableに一度SQLサーバーからすべてをロードしないでくださいあなたは

    • を処理するデータのビット量について話している場合は特に、あります

    最初に、データセットが実際に大きければ、このデータをSQLサーバーからコンピュータに転送するのに時間がかかります。そして、処理中にこのデータセットを格納するためには多くのメモリが必要です。複数のスレッドを使用すると、大規模なデータセット全体のコピーを効果的に実行できます。メモリ使用量が多いと不要なガベージコレクションが発生し、アプリケーションのパフォーマンスが低下する可能性があります。スワッピングの危険があり、あなたのパフォーマンスは破壊されます。

    データ行の処理順序は重要ではありませんし、すべての行が他の人からindependantly処理することができた場合、あなたはこのように行くことができます記録

  • ストア、一部では、このデータによって、DataReaderのレコードと

    • 読み出したデータをスレッドセーフなコレクション
    • あなたがデータを読んでいる間、あなたが複数のスレッド

    によって処理を開始することができますおそらくあなたはそのOのためのLinkedListコレクションを使用することになるでしょう(1 )項目を追加したり削除したりする複雑さ。このコレクションへのスレッドセーフなアクセスを忘れないでください。この場合 は、利益何を得る:

    • スタート処理をするとすぐSQLサーバーからの最初のバイトは、処理中に
    • 少ないメモリ使用量を受け取りました。いくつかのデータを複数回保存する必要はなく、他のデータの処理を待っている間に、すでに処理されたデータを保存する必要はありません。

    通常のデータサイズ、SQLサーバーの設定、サーバーのメモリ容量などに応じて、できるだけ早くSQLからすべてのデータをロードするか、遅延を伴うデータをロードして未処理あなたのコレクションのレコード。