Web服务中的多线程加速了处理速度

本文关键字:加速 处理速度 多线程 服务 Web | 更新日期: 2023-09-27 18:02:48

我确实有一个桌面程序的业务逻辑处理。

然而,当我处理大数据时,数据处理速度非常慢(我使用的是MS SQL数据库)。因此,我做了一个工作。我打开一个web服务项目,并将我的业务逻辑过程打包到一个名为consoleAttn()的dll中,然后使用DotNet Task将处理分离为几个线程。并行技术的代码如下:

`

    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服务崩溃时,我应该如何做异步进程?

Web服务中的多线程加速了处理速度

有几种方法可能会有所帮助,特别是如果您正在讨论要处理的数据位数

  • 不要一次从SQL server加载所有的数据
  • 不克隆DataTable

首先,如果数据集非常大,将这些数据从SQL服务器传输到您的计算机将花费时间。然后,这个数据集在处理时需要大量的内存来存储。使用多个线程,您可以有效地复制整个大数据集。高内存使用率会导致不必要的垃圾收集和较差的应用程序性能,特别是在服务器内存不多的情况下。有交换的风险,你的性能将被破坏。

如果数据行处理顺序无关紧要,并且每一行都可以独立处理,您可以这样做:

  • 使用DataReader逐记录读取数据
  • 将此数据存储在某个线程安全的集合中
  • 当你正在读取数据时,你可以通过多个线程开始处理

也许你想要使用LinkedList集合,因为它的复杂度为0(1)来添加和删除项目。不要忘记对这个集合的线程安全访问。在这种情况下,您得到了什么好处:

  • 从SQL server接收到第一个字节后立即开始处理
  • 处理过程中较少的内存使用。你不需要多次存储一些数据,不需要存储已经处理的数据,而等待其他数据被处理。

根据典型的数据大小,SQL server配置,您的服务器内存量等,您可能希望从SQL中加载所有数据尽快或加载数据与一些延迟,以确保没有太多的未处理的记录在您的集合