2016-08-18 67 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的所有数据,以确保没有太多的未处理记录在你的收藏。