学习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();

解决方案 »

  1.   

    建议:
    1. 数据库打开的时间太长,这样容易消耗资源。需要从数据库取什么数据,直接读取出来,然后用一个变量来保存即可。在第一段代码中,数据库在Form建立之前即被打开,而在整个逻辑结束以后才被关闭。这样造成数据库的链接一直在使用中,会消耗不少资源。
      

  2.   

    建议可以handleExce的退出事件,在这种事件中来做操作。比直接在这个方法中写线程代码逻辑要清晰。并且便于调试。 HOW TO: Handle Events for Excel by Using Visual C# .NET
    http://support.microsoft.com/?id=823981
      

  3.   

    谢谢版主,这么耐心看完我的代码,并且给出中肯的意见,继续聆听楼下的高见.也为后来者提供一份翔实的资料!ps:在代码中我使用了AdoHelper类(类似SqlHelper),我怀疑是不是它一直open,没有close,dispose而占用了系统资源?!
      

  4.   

    关于数据库操作的部分写到一个新的类里面,sqlserver用存储过程
      

  5.   

    一般.NET程序占用30~40M内存是正常的!
      

  6.   

    一、Connection不需要手动的Dispose,但必须要Close
    Close已经把非托管的连接释放了(或者还给数据连接池了),而Dispose不但释放非托管资源而且还会释放托管资源。由于Dispose操作本身十分耗费资源,所以,如果对于托管资源如果没有特殊的业务需求请不要手动调用Dispose方法,强制执行Dispose方法将会直接导致程序效率的下降
      

  7.   

    另,线程本身就是资源开销比较大的,再加上COM操作速度就更加受影响了;版本发布的时候选择Release方式编译,运行速度会快很多
      

  8.   

    大家要充分发挥.NET的内在强大的功能,不要单单使用了他的表层的东西.
    有好建议的大家发言..我的建议:
    注重程序的框架,学JAVA
      

  9.   

    第一 程序调用了Excel DCOM对象。这个对象初始化的时候就需要至少15秒的停滞时间(机器配置高效果也不明显)
    第二 建议使用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算法还是有自己的独到之处的。
      

  10.   

    恩,楼上的分析很不错。
    不过我还是坚持不要手动调用Dispose方法,而且对于Connection更加不需要手动Dispose。楼上的只是把Dispose方法反编译了,你可以也把Close方法也反编译看看呢。至于为什么不需要手动调用Dispose方法,可以参考这里http://www.microsoft.com/china/msdn/archives/library/dndotnet/html/highperfmanagedapps.asp