C#程序执行时间长查询速度慢解决方案
作者:叶丶梓轩 发布时间:2023-10-31 08:49:05
标签:C#,程序,执行
一,程序执行慢导致的原因就是查询数据库慢.,导致返回值慢,那这个要怎么解决呢?
1,优化数据库查询如这个文章 C#导出数据到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》结果需要排序,因为并行线程的结果是乱序的
来源:https://www.cnblogs.com/May-day/p/13268443.html


猜你喜欢
- 本文实例为大家分享了QT实现简单计算器功能的具体代码,供大家参考,具体内容如下效果图:新建工程,创建类MainWindow,基类是QMain
- Spring MVC 请求处理流程用户发起请求,到 DispatcherServlet;然后到 HandlerMapping 返回处理器链(
- 在上面的例子中多次使用到了Thread类的join方法。我想大家可能已经猜出来join方法的功能是什么了。对,join方法的功能就是使异步执
- 说实话,关于Android中对短信的一些相关操作是一个比较入门的东西。那我现在还要来写这一篇博客的原因只是因为现在开发中有相关内容,而又想将
- 如果对空的对象进行操作,就会造成意外错误。所以我们在使用对象前,一般会进行非空判断接下来介绍我知道的三种判断非空方法:1、if判断这个最直接
- maven 常见命令配置maven常用命令#创建项目 -D设置参数mvn archetype:generate -DgroupId=cn.d
- 介绍在上一篇“SimpleAdapter“章节中,我们看到了把:ListView和Listview内
- 一、内存池基础知识1、什么是内存池1.1 池化技术池化技术是计算机中的一种设计模式,主要是指:将程序中经常要使用的计算机资源预先申请出来,由
- 在有些情况下死锁是可以避免的。本文将展示三种用于避免死锁的技术:1.加锁顺序2.加锁时限3.死锁检测加锁顺序当多个线程需要相同的一些锁,但是
- Intellij IDEA 公司 JetBrains 推出了一种新字体:JetBrains Mono,它是专为开发人员设计的。为什么说它是专
- 满满的都是坑,因为服务器偷懒让客服端写统一下单,服务器只给了通知的url。微信的支付demo并没有统一下单的代码。读此文前先阅读: http
- 简介在上一篇文章中,我们列举了flutter中的所有layout类,并且详细介绍了两个非常常用的layout:Row和Column。掌握了上
- 一、 HttpURLConnection以GET方式访问网络:HttpURLConnection connection = null;try
- 以往都是使用反射调用实例方法,那么反射如何调用静态方法呢?看下面的例子Class<?> threadClazz = Class.
- using System;using System.Collections.Generic;public class Example{ &n
- 前言使用Redis来实现Session共享,其实网上已经有很多例子了,这是确保在集群部署中最典型的redis使用场景。在SpringBoot
- 本文讲述绘制Android自定义各种图形效果,为自定义控件的入门篇 相关视频链接: Android自定义控件系列 http://edu.cs
- 项目里面用到了语音唤醒功能,前面一直在用讯飞的语音识别,本来打算也是直接用讯飞的语音唤醒,但是讯飞的语音唤醒要收费,试用版只有35天有效期。
- 1、继承Thread类方式这种方式适用于执行特定任务,并且需要获取处理后的数据的场景。举例:一个用于累加数组内数据的和的线程。public
- spring profile 多环境配置管理现象 如果在开发时进行一些数据库测试,希望链接到一个测试的数据库,以避免对开发数据