减少Import中的new,对应一些不变的,不要把new放到循环里

解决方案 »

  1.   

    好长的代码
    粗略看了一下
    所有数据库连接的地方都只open,不close
    时间长了,不光是内存泄露问题,你数据库连接池满了,就再也连不上数据库了
      

  2.   

    1.你的timer没在类里保持引用,出了onstart就丢了。当然这不会引起内存泄漏,只是造成其他问题
    2.安全一点说,凡是实现了IDispose接口的,都要考虑释放问题。比如timer,DirectoryEntry,SqlConnection
    3.带界面的服务虽然说不出有什么问题,但感觉不对反正少见
      

  3.   

    把你的  if (DateTime.Now.Minute == 30)  { }   这个代码块里的 代码,进行一个“防重入”保护,避免前一个未完毕就重复执行下一个。最好写一个日志,看看每一次什么时间开始、停止。
      

  4.   

    1分钟执行一次..显然不合理..虽然你什么都没干..但是实际上他干了好多你不知道的事情.所以我觉得 这种"定时"的东西 不如交给Quarzt.Nethttp://www.cnblogs.com/lzrabbit/archive/2012/04/15/2448326.html很简单的代码 只下载例子 并且把你的代码移植到一个类中就行了..测试无压力 感觉还可以 很方便
      

  5.   

    按照你说的把new放循环外面了;按照你说的,我后面加了close。
      

  6.   

    DirectoryEntry entry 和 DirectorySearcher用到了非托管资源,都需要Dispose(),直接用using()吧
      

  7.   

    SqlConnection和SqlCommand也是一样,需要手动释放
      

  8.   

    我在方法里写了 SqlConnection conn = new SqlConnection(connStr); 这样每调用这个方法,就会创建一次连接,我想把这个放到外面去,只创建一次连接,不知道怎么写
      

  9.   

    在程序里不要这么做,如果你真想从这方面提高效率,你应该借助“存储过程”
    弄到方法外面,会出现不确定的问题,比如你如果用到了sqlDataReader,这个是需要独占一个连接的,但读取速度非常快
      

  10.   

    for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (accountNames.Contains(";" + dt.Rows[i]["UserAccount"].ToString() + ";") == false)
                    {
                        string sql_del_user = "delete from [User] where UserAccount=@UserAccount";像这种一次需要执行多条语句的,一般用的存储过程,这样逻辑相对清晰
    不过程序中,也可以将多次执行的sql的参数列表,放到一个List<SqlParameter>中
    然后将这N条SQL语句的参数列表放到一个外层的列表中然后一次连接,执行一次,清除参数,重新填充下一条纪录的参数,再次执行..
    类似下面这样
    public int MultiExecuteNonQuery(string sql, IList<IList<SqlParameter>> parametersList)
            {
                int affectedRows = 0;
                SqlConnection connection = null;
                SqlTransaction transaction = null;
                SqlCommand command = null;
                try
                {
                    connection = GetDbConnection();
                    connection.Open();
                    transaction = connection.BeginTransaction();
                    command = new SqlCommand(connection);
                    command.CommandText = sql;
                    if (parametersList == null || parametersList.Count == 0)
                    {
                        affectedRows += command.ExecuteNonQuery();
                    }
                    else
                    {
                        foreach (var parameters in parametersList)
                        {
                            command.Parameters.Clear();
                            if (parameters != null && parameters.Count > 0)
                            {
                                foreach (SqlParameter parameter in parameters)
                                {
                                    command.Parameters.Add(parameter);
                                }
                            }
                            affectedRows += command.ExecuteNonQuery();
                        }
                    }
                    transaction.Commit();                
                }
                finally
                {
                    if (connection != null) connection.Close();
                    if (transaction != null) transaction.Dispose();
                    if (command != null) command.Dispose();
                }
                return affectedRows;       
            }   
      

  11.   

    按照你说的,对 DirectoryEntry 和 DirectorySearcher 用了using。sqlcomand sqlconnection 没用using,sqlconnection只colse了,没dispose。因为循环中总是需要使用到 sqlconnection和sqlcommand,如果dispose了,又需要再创建连接,这么效率会不会更差?
      

  12.   

    尽量多的使用using(){} 块,特别是数据库相关操作(connection, command , adapter ....)
    不要强制干涉去close和dispose. 让系统自动的去释放!