• C#程序执行时间长和慢查询解决: 线程并行实现处理


     一,程序执行慢导致的原因就是查询数据库慢.,导致返回值慢,那这个要怎么解决呢?

    1,优化数据库查询如这个文章,导出大量数据到excel,怎么提升性能

    2,使用线程并行查询,然后合并成一个集合,代码如下,必须留意备注的核心点

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace TestConsoleApp
    {
        /// <summary>
        ///C#慢查询解决: 线程并行实现处理
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
                List<Task> taskList = new List<Task>();
                int count = 100;
                int batch = count % 10;
                object lockObj = new object();
                List<int> list = new List<int>();
    
                ///开启线程并行执行
                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();
                for (int i = 0; i < batch; i++)
                {
                    taskList.Add(Task.Run(() =>
                    {
                        for (int j = count * i; j < count * (i + 1); j++)
                        {
                            ///休眠等待,模拟慢查询需要消耗的时间
                            Thread.Sleep(100);
                            ///核心逻辑:避免线程插入冲突
                            lock (lockObj)
                            {
                                list.Add(i);
                            }
                        }
                    }));
                }
                ///这里核心是等待所有的线程结束,然后再执行下去
                Task.WaitAll(taskList.ToArray());
                ///这里再内存处理排序,避免返回的结果跟正常查询出来的结果排序不一致
                list = list.OrderByDescending(u => u).ToList();
                Console.WriteLine(stopwatch.ElapsedMilliseconds);
    
    
                Console.WriteLine("**********分割线***********");
    
                ///原始遍历实现
                List<int> list2 = new List<int>();
                Stopwatch stopwatch2 = new Stopwatch();
                stopwatch2.Start();
                for (int i = 0; i < count; i++)
                {
                    ///休眠等待,模拟慢查询需要消耗的时间
                    Thread.Sleep(100);
                    list2.Add(i);
                }
                Console.WriteLine(stopwatch2.ElapsedMilliseconds);
                Console.ReadLine();
            }
        }
    }

    PS:核心点

    1》线程等待线程结束Task.WaitAll

    2》锁住集合,以防插入占用导致报错

    3》结果需要排序,因为并行线程的结果是乱序的

  • 相关阅读:
    Apache Bench安装与使用
    关于浏览器和HTTP协议
    Selenium2+Python:Webdriver API速记手册
    unittest框架概要
    安装浏览器驱动和测试环境参数化
    基础知识回顾——异常处理
    基础知识回顾——简单语句汇总
    基础知识回顾——迭代器和生成器
    基础知识回顾——上下文管理器
    基础知识回顾——方法
  • 原文地址:https://www.cnblogs.com/May-day/p/13268443.html
Copyright © 2020-2023  润新知