c#线程中的代码执行时间非固定,而是越来越长
是这样的,我创建了一个线程A,A是写在一个thread类型定时器内,用来循环执行A,循环时间设置为5S,在A中有一段for循环代码,为了测试该代码每次执行过程的大致时间,我在代码前后分别加了两个累加数,测试发现刚开始很快,不到1S就执行完毕。但随着时间的流逝,执行整段循环代码的耗时越来越长,甚至超过5S。每次重新运行都是刚开始很快,然后慢慢变慢。
因为代码里面含有对数据库的操作,每次重新运行都是刚开始很快,然后慢慢变慢。所以个人觉得应该不是数据库表中数据太多导致响应时间慢慢变长。嵌套的for循环次数也不是太多,外层12,内层16,也就12X16=192次。但是发现将其改为2X5次后,就发现耗时基本保持固定数,或者叫增长的极其缓慢。
问题1.是什么导致耗时越来越长,每次执行不应该是差不多固定时间才对嘛?
问题2.我同时监视了CPU和内存,内存一直保持很稳定,但CPU不稳定,基本每隔5秒,就是每次执行循环代码时,CPU都会明显上升,然后回落,我给循环代码内部加了sleep(1),还是解决不了问题。另外按理说12X16次数也不是很多。改为2X5后CPU基本保持稳定。那我应该如何做才能避免CPU占用高呢?
求各位给出建议,下面我贴下代码:
以下均为A()方法中的代码
num1++;
label1.text = num1.tostring();
//连接数据库
SqlConnection con = new SqlConnection();
con.ConnectionString = @"Data Source =王-THINK;Initial Catalog=hw;Integrated Security=SSPI";
con.Open();
SqlCommand com = new SqlCommand();
com.Connection = con;
com.CommandType = CommandType.Text;
for (int i = 0; i < 12; i++)
{
for (int j = 0; j < 16; j++)
{
//下面两行代码是在th这个图片类型中创建一个矩形,用来获取该矩形的最大值,引用的第三方dll,这个DLL很成熟,可以排除耗时跟它无关。
MeasurementRectangle rectangle = th.Measurements.Add(new Rectangle(j * 20, i * 20, 20, 20));
temp[i, j] = rectangle.Max.Value;
//存入数据库
com.CommandText = "insert into [Table7_Temp] (时间,时,分,秒,毫秒,行,列,温度,标识,辐射率,摄像机号,区域号,creattime,总貌X,总貌Y,总貌H,总貌W)Values(//里面的变量就赘述了,但包含 temp[i, j] );
SqlDataReader dr = com.ExecuteReader();//执行SQL语句
dr.Close();//关闭执行
}
}
con.Close();//关闭数据库连接
num2++;
label2.text = num2.tostring();
因为代码里面含有对数据库的操作,每次重新运行都是刚开始很快,然后慢慢变慢。所以个人觉得应该不是数据库表中数据太多导致响应时间慢慢变长。嵌套的for循环次数也不是太多,外层12,内层16,也就12X16=192次。但是发现将其改为2X5次后,就发现耗时基本保持固定数,或者叫增长的极其缓慢。
问题1.是什么导致耗时越来越长,每次执行不应该是差不多固定时间才对嘛?
问题2.我同时监视了CPU和内存,内存一直保持很稳定,但CPU不稳定,基本每隔5秒,就是每次执行循环代码时,CPU都会明显上升,然后回落,我给循环代码内部加了sleep(1),还是解决不了问题。另外按理说12X16次数也不是很多。改为2X5后CPU基本保持稳定。那我应该如何做才能避免CPU占用高呢?
求各位给出建议,下面我贴下代码:
以下均为A()方法中的代码
num1++;
label1.text = num1.tostring();
//连接数据库
SqlConnection con = new SqlConnection();
con.ConnectionString = @"Data Source =王-THINK;Initial Catalog=hw;Integrated Security=SSPI";
con.Open();
SqlCommand com = new SqlCommand();
com.Connection = con;
com.CommandType = CommandType.Text;
for (int i = 0; i < 12; i++)
{
for (int j = 0; j < 16; j++)
{
//下面两行代码是在th这个图片类型中创建一个矩形,用来获取该矩形的最大值,引用的第三方dll,这个DLL很成熟,可以排除耗时跟它无关。
MeasurementRectangle rectangle = th.Measurements.Add(new Rectangle(j * 20, i * 20, 20, 20));
temp[i, j] = rectangle.Max.Value;
//存入数据库
com.CommandText = "insert into [Table7_Temp] (时间,时,分,秒,毫秒,行,列,温度,标识,辐射率,摄像机号,区域号,creattime,总貌X,总貌Y,总貌H,总貌W)Values(//里面的变量就赘述了,但包含 temp[i, j] );
SqlDataReader dr = com.ExecuteReader();//执行SQL语句
dr.Close();//关闭执行
}
}
con.Close();//关闭数据库连接
num2++;
label2.text = num2.tostring();
...全文
相关推荐
C#多线程ThreadPool线程池详解
线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。2.
C#中基于Task的线程池实现
C#中基于Task的线程池实现后台任务的形式单线程多线程线程池代码实现实现思路更多扩展 后台任务的形式 在日常开发中总是免不了接触到后台任务,如:定时清理、Socket通讯等。一般来说后台任务根据线程模型可以分为:单线程、多线程、线程池。 单线程 如果后台任务需要严格按时序进行,而且任务和任务之间不能并行处理的话,应该选用单线程实现。 多线程 如果后台任务之间可以并行处理就可以选用多线程模式实现,因为线程的开启和销毁都是需要资源的,所以有如下公式: 执行总消耗 = 开启线程消耗 + 任务消耗 + 销毁线程
c# Timer 中怎么在固定时间和固定周期中调用事件
本篇文章将详细介绍如何利用C#中的`System.Windows.Forms.Timer`在固定时间和固定周期内调用事件。#### 一、基础知识简介1.
模拟进程调度C#版(基于时间片的轮转调度)
系统将所有就绪进程放入一个队列,然后每次分配一个固定的时间片(例如10ms)给队列中的第一个进程。当时间片用完后,即使该进程尚未完成,也会被强制切换到就绪队列的末尾,下一次调度时再轮到它。
time-module:C#时间模块
在多线程或异步编程中,`Stopwatch`类是另一个重要的时间工具。它可以精确地测量代码执行所需的时间,这对于性能测试和优化非常有用。


