学习C#,一个简单的数据库访问的winform,运行起来.在任务管理器一看,狂占资源,查查msdn只有关于aspnet方面提高系统性能的资料.想试着提高性能,不知从何下手,征求大家高见,或者提供一些优秀的源码参看!一:从登录窗体到主窗体这个过程都n慢,二:导出简单的两条数据到Excel就明显感觉时间很长.等等
下面是部分示例代码,大家看是否改进?
for example
一:
con.Open ();
OleDbCommand cmd=new OleDbCommand(sql,con);
OleDbDataReader dr=cmd.ExecuteReader ();
try
{
if(dr.Read ())
{
this.Hide ();
Form1 main=new Form1 ();
main.ShowDialog ();
}
else
{
MessageBox.Show ("登录失败");
txtPwd.Text =string.Empty ;
txtPwd.Focus ();
return;
}
}
catch(Exception err)
{
MessageBox.Show (err.Message );
}
finally
{
con.Close ();
dr.Close();
con.Dispose ();
}二:调用方法 导出数据到Excelprivate void btnToExcel_Click(object sender, System.EventArgs e)
{
saveDialog.DefaultExt ="xls";
saveDialog.Filter ="Excel文件|*.xls";
saveDialog.ShowDialog ();
if(saveDialog.FileName.IndexOf (":")<0) return;//被点了取消
else
{
if(saveDialog.FileName.Trim () ==" ")
MessageBox.Show ("请填写欲保存的文件名");
else
{
//启动另外线程导出数据到Excel
ThreadStart ToExcelThread=new ThreadStart (ToExcel);
Thread thr=new Thread (ToExcelThread);
thr.Start ();
}
}
}另外:显示窗体我都是在单击事件中这样写的:
Form1 frm1=newForm1(); frm1.ShowDialog();
下面是部分示例代码,大家看是否改进?
for example
一:
con.Open ();
OleDbCommand cmd=new OleDbCommand(sql,con);
OleDbDataReader dr=cmd.ExecuteReader ();
try
{
if(dr.Read ())
{
this.Hide ();
Form1 main=new Form1 ();
main.ShowDialog ();
}
else
{
MessageBox.Show ("登录失败");
txtPwd.Text =string.Empty ;
txtPwd.Focus ();
return;
}
}
catch(Exception err)
{
MessageBox.Show (err.Message );
}
finally
{
con.Close ();
dr.Close();
con.Dispose ();
}二:调用方法 导出数据到Excelprivate void btnToExcel_Click(object sender, System.EventArgs e)
{
saveDialog.DefaultExt ="xls";
saveDialog.Filter ="Excel文件|*.xls";
saveDialog.ShowDialog ();
if(saveDialog.FileName.IndexOf (":")<0) return;//被点了取消
else
{
if(saveDialog.FileName.Trim () ==" ")
MessageBox.Show ("请填写欲保存的文件名");
else
{
//启动另外线程导出数据到Excel
ThreadStart ToExcelThread=new ThreadStart (ToExcel);
Thread thr=new Thread (ToExcelThread);
thr.Start ();
}
}
}另外:显示窗体我都是在单击事件中这样写的:
Form1 frm1=newForm1(); frm1.ShowDialog();
解决方案 »
- EF框架查询提示,值不在预期的范围内
- URL后缀名重写了,301跳转代码怎么写,我程序ASP.NET(C#),谢谢!
- 急急急
- c# 中的一个小问题
- c# TcpClinet 怎么自动接收数据!!
- 安装部署问题
- 关于返回对象的问题
- 求助 PHP
- 关于datatable.Columns.Add("IntQyt", typeof(Int32), "Convert(bgoodsqty,'System.Int32')")
- 请问?
- sql server 数据有关问题,大家帮忙~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 关于传图片问题,急!
1. 数据库打开的时间太长,这样容易消耗资源。需要从数据库取什么数据,直接读取出来,然后用一个变量来保存即可。在第一段代码中,数据库在Form建立之前即被打开,而在整个逻辑结束以后才被关闭。这样造成数据库的链接一直在使用中,会消耗不少资源。
http://support.microsoft.com/?id=823981
Close已经把非托管的连接释放了(或者还给数据连接池了),而Dispose不但释放非托管资源而且还会释放托管资源。由于Dispose操作本身十分耗费资源,所以,如果对于托管资源如果没有特殊的业务需求请不要手动调用Dispose方法,强制执行Dispose方法将会直接导致程序效率的下降
有好建议的大家发言..我的建议:
注重程序的框架,学JAVA
第二 建议使用Release版本在项目属性中设置代码优化和安全益处检查为True
第三 关于这个Dispose,其实个人感觉没什么,下面是con的Dispose代码
protected override void Dispose(bool disposing)
{
if (disposing)
{
switch (this._objectState)
{
case ConnectionState.Open:
{
this.Close();
break;
}
}
this._constr = null;
}
base.Dispose(disposing);
}public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
这里没有强制调用GC的垃圾回收方法。所以我个人感觉“如果对于托管资源如果没有特殊的业务需求请不要手动调用Dispose方法,强制执行Dispose方法将会直接导致程序效率的下降”太绝对了。GC算法还是有自己的独到之处的。
不过我还是坚持不要手动调用Dispose方法,而且对于Connection更加不需要手动Dispose。楼上的只是把Dispose方法反编译了,你可以也把Close方法也反编译看看呢。至于为什么不需要手动调用Dispose方法,可以参考这里http://www.microsoft.com/china/msdn/archives/library/dndotnet/html/highperfmanagedapps.asp