2016-08-18 88 views
0

我在桌面程序中有一個業務邏輯處理。Web服務中的多線程以加快處理速度

然而,數據處理是可怕的慢,當我與大數據,(我使用MS SQL數據庫)處理。因此,我會做一些工作。我打開Web服務項目,並將其打包我的業務邏輯處理成一個DLL名稱consoleAttn(),則處理如下代碼分成幾個線程,與DOTNET的Task.Parallel理工科:

`

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."; 

1)你有什麼想法,當我需要停止進程或調用Web服務的客戶端崩潰時,我應該如何執行異步過程?

回答

0

有幾種方法可以幫助,特別是如果你談論的是數據的位數來處理

  • 不要在巨大的DataTable
  • 不要克隆的DataTable
  • 一次加載一切從SQL服務器

首先,如果數據集是非常大的,它需要一定的時間來從SQL服務器這些數據傳輸到您的計算機。然後,該數據集需要大量內存才能在處理時進行存儲。使用多個線程,您可以有效地完成整個大數據集的複製。高內存使用率可能會導致不必要的垃圾收集和更差的應用程序性能,尤其是在服務器內存不足的情況下。存在交換風險,您的表現將被破壞。

如果數據行處理順序並不重要,每行可independantly別人來處理,你可以走這條路:通過記錄

  • 存儲這些數據在一些與DataReader的記錄

    • 讀數據線程安全的集合
    • 當你正在閱讀的數據可以被多個線程

    開始處理也許你將要使用的LinkedList集合了O(1 )添加和刪除項目的複雜性。不要忘記線程安全訪問這個集合。 在這種情況下,什麼好處你:

    • 開始處理,只要從SQL Server第一個字節處理期間收到
    • 使用更少的內存。您不需要多次存儲某些數據,也不需要存儲已處理的數據,而您正在等待處理其他數據。

    根據數據的典型大小,SQL服務器配置,您的服務器的內存量等,你可能想要麼有一些延誤儘快或加載數據加載從SQL的所有數據,以確保沒有太多的未處理記錄在你的收藏。

  • 相關問題