通常在大数据量计算的应用程序里,CPU大部分时间处理等待状态.在一个单线程的应用程序里,这些查询会导致window消息处理能力阻塞,这里会导致计算时间很长,CPU利用率也非常低.
最近一直在研究,提高处理性能的方法.
开始利用,多线程,异步的方法来实现,
下面的语句是用来分段进行数据整合, (如按天,或按月,对中间数据进行整合)整合SQL通过批量生成
在单线程的执行时间,CPU利用率一般在1-10%,(服务器HP 580 4 CPU XEON 3.0G 16G内存,加盘柜),这样整合时间太长。
如果分段整合,CPU利用率就在40-80%得到比较大的利用。
FileInfo[] files;
private
void
button1_Click(
object
sender, System.EventArgs e)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
{
if(folderBrowserDialog1.ShowDialog() == DialogResult.OK)
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
System.IO.DirectoryInfo di = new DirectoryInfo(folderBrowserDialog1.SelectedPath);
files = di.GetFiles();
ThreadStart ts = new ThreadStart(start);
Thread thread = new Thread(ts);
thread.Start();
}
}
public
delegate
string
myMethodDelegate(
object
[] args);
static
int
t
=
0
;
void
start()
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
{
foreach(FileInfo file in files)
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
System.IO.StreamReader sr = new StreamReader(file.FullName,System.Text.Encoding.Default);
string txt = sr.ReadToEnd();
sr.Close();
myMethodDelegate ddd= new myMethodDelegate(Work2);
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
ddd.BeginInvoke(new object[]
{txt_connectString.Text,txt,file.FullName},new AsyncCallback(EndWorkBack), null);
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
Write(string.Format("T:{0}|{1} {1}/r/n",DateTime.Now,file.FullName,t));
//_Task.StartTask(new TaskDelegate(_Task.Work2),new object[]{txt_connectString.Text,txt});
}
}
public
string
Work2(
object
[] args)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
{
using(SqlConnection conn = new SqlConnection(args[0].ToString()))
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
using(SqlCommand comm = new SqlCommand(args[1].ToString(),conn))
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
comm.CommandTimeout = 60000;
conn.Open();
comm.ExecuteNonQuery();
}
conn.Close();
}
return args[2].ToString();
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
}
int
i
=
0
;
protected
void
EndWorkBack( IAsyncResult ar )
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
{
myMethodDelegate ddd = (myMethodDelegate)ar.AsyncState;
string result = ddd.EndInvoke( ar );
i++;
Write(string.Format("T:{3}:{2}:{0} {1}/r/n",result,DateTime.Now,i,t));
}
public
void
Write(
string
msg)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
{
System.IO.StreamWriter sw = new StreamWriter("C://install.log",true,System.Text.Encoding.Default);
sw.WriteLine(msg);
sw.Close();
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
}
不过上面程序也有一点问题,就是异步线程数据没有好的控制。如果同时执行线程,过多,CPU时间片分配就不合理,执行速度反而慢。
后来就一直想用线程池的来合理处理线程。
。Net自带的线程池使用起来比较简单。
通过System.Threading.ThreadTool类就可以使用,
定义回调方法
WaitCallback async = new WaitCallback(FExeute);
通过ThreadPool.QueueUserWorkItem(async,service);加入队列
回调方法执行运算
public
void
FExeute(
object
Param)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
{
//myResetEvent.WaitOne();
using(TG_EvaluteBaseDatasSet service = (TG_EvaluteBaseDatasSet)Param)
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
service.doResult();
writeFile(Path,service) ;
OnTgReport(new ReportEvent(service.TE_PASS_RANGE,service.TE_YEAR,service.TE_MONTH,int.Parse(service.TE_I_E_FLAG),int.Parse(service.TE_ENTRY_TYPE)));
}
Interlocked.Decrement(ref number);
//number--;
}
其中Interlocked.Decrement,是调用原子操作,进行减操作,
Interlocked.Increment(ref number);是调用原子操作,进行加
原子操作在多线程中不会有冲突。
线程池有几点好处,
1。多线程执行,
2。根据CPU个数,性能等,合理安排执行的线程,(在实际操作过程中,通过SQL SERVER企业管理器中查看当前活动的进程数,可以看到当前正在执行的线程数)
3。异步操作。
相关资源:
http://www.ddvip.net/program/c-/index2/15.htm
http://www.codeproject.com/csharp/threadtests.asp
http://www.microsoft.com/china/MSDN/library/netFramework/netframework/NECLRT.mspx
源码下载:
http://www.cnblogs.com/Files/edobnet/Report.rar
posted on 2005-11-29 16:29
edobnet 阅读(3087)
评论(6)
编辑
收藏
引用
网摘 所属分类:
.Net 、
Architecture
![](https://i-blog.csdnimg.cn/blog_migrate/2df6a5fadcb6f7f93e46afe309048d48.jpeg)
<script type="text/javascript"> // </script>
评论:
#
re: 利用.Net 线程池提高应用程序性能. 2005-11-29 18:19 |
我最近也在关注线程池 不过不知道你想做啥工作
回复
更多评论
#
re: 利用.Net 线程池提高应用程序性能. 2005-11-29 18:23 |
#
re: 利用.Net 线程池提高应用程序性能. 2005-11-30 10:21 |
不懂你为何弄得那么慢复杂,所以不知道你的重点在哪里
回复
更多评论
#
re: 利用.Net 线程池提高应用程序性能. 2005-11-30 10:40 |
我在资源开销较大的程序中,基本都用到了异步线程调用,不过没有想起来用线程池去管理
回复
更多评论
#
re: 利用.Net 线程池提高应用程序性能. 2005-11-30 11:57 |
我的工作,是批量生成报表.按部门,类别生成.每一份报表都类似!
回复
更多评论
#
re: 利用.Net 线程池提高应用程序性能.
2005-11-30 12:01 |
单个工作任务使用异步,实现起来比较简单,但是,N个任务,用异步做起来还是比较烦的.
回复
更多评论