【问题标题】:Multi Threading in Web Service to speed up processing speedWeb服务中的多线程以加快处理速度
【发布时间】:2016-08-18 07:56:46
【问题描述】:

我确实在桌面程序中有业务逻辑处理。

但是,当我处理大数据时,数据处理速度非常慢(我使用的是 MS SQL 数据库)。因此,我做了一个工作。我打开一个web服务项目,将我的业务逻辑流程打包成一个dll名称consoleAttn(),然后将处理分成几个Threading,使用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服务的客户端崩溃时,我应该如何执行异步进程?

【问题讨论】:

    标签: c# asp.net multithreading


    【解决方案1】:

    有几种方法可能会有所帮助,尤其是当您谈论要处理的数据量时

    • 不要将 SQL Server 中的所有内容一次加载到巨大的 DataTable 中
    • 不要克隆 DataTable

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

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

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

    您可能会想要使用 LinkedList 集合,因为它的 O(1) 复杂性来添加和删除项目。不要忘记对这个集合的线程安全访问。 在这种情况下,您将获得什么好处:

    • 收到来自 SQL 服务器的第一个字节后立即开始处理
    • 处理过程中使用的内存更少。您不需要多次存储某些数据,也不需要存储已经处理的数据,同时等待处理其他数据。

    根据典型的数据大小、SQL 服务器配置、服务器内存量等,您可能希望尽快从 SQL 加载所有数据或延迟加载数据,以确保您的数据库中没有太多未处理的记录收藏。

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多