服务占用内存为何越来越高? 减少Import中的new,对应一些不变的,不要把new放到循环里 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 好长的代码粗略看了一下所有数据库连接的地方都只open,不close时间长了,不光是内存泄露问题,你数据库连接池满了,就再也连不上数据库了 1.你的timer没在类里保持引用,出了onstart就丢了。当然这不会引起内存泄漏,只是造成其他问题2.安全一点说,凡是实现了IDispose接口的,都要考虑释放问题。比如timer,DirectoryEntry,SqlConnection3.带界面的服务虽然说不出有什么问题,但感觉不对反正少见 把你的 if (DateTime.Now.Minute == 30) { } 这个代码块里的 代码,进行一个“防重入”保护,避免前一个未完毕就重复执行下一个。最好写一个日志,看看每一次什么时间开始、停止。 1分钟执行一次..显然不合理..虽然你什么都没干..但是实际上他干了好多你不知道的事情.所以我觉得 这种"定时"的东西 不如交给Quarzt.Nethttp://www.cnblogs.com/lzrabbit/archive/2012/04/15/2448326.html很简单的代码 只下载例子 并且把你的代码移植到一个类中就行了..测试无压力 感觉还可以 很方便 按照你说的把new放循环外面了;按照你说的,我后面加了close。 DirectoryEntry entry 和 DirectorySearcher用到了非托管资源,都需要Dispose(),直接用using()吧 SqlConnection和SqlCommand也是一样,需要手动释放 我在方法里写了 SqlConnection conn = new SqlConnection(connStr); 这样每调用这个方法,就会创建一次连接,我想把这个放到外面去,只创建一次连接,不知道怎么写 在程序里不要这么做,如果你真想从这方面提高效率,你应该借助“存储过程”弄到方法外面,会出现不确定的问题,比如你如果用到了sqlDataReader,这个是需要独占一个连接的,但读取速度非常快 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; } 按照你说的,对 DirectoryEntry 和 DirectorySearcher 用了using。sqlcomand sqlconnection 没用using,sqlconnection只colse了,没dispose。因为循环中总是需要使用到 sqlconnection和sqlcommand,如果dispose了,又需要再创建连接,这么效率会不会更差? 尽量多的使用using(){} 块,特别是数据库相关操作(connection, command , adapter ....)不要强制干涉去close和dispose. 让系统自动的去释放! WebBrowser 遇到 javascript:void(0) 页面无响应 大清早的问个幼稚的问题 在继承的组件中怎样引用自己,用base好象失败了 C#WinForm中ListView的数据拖拽问题 向高手求救 如何算出结果 100求C#写的"数据结构演示"的原代码.. ini多行文件的读取请教!!!!!!!!!!!!!!!!!!!! 我是大学老师,请问学生该如何学习C# 有关于DropDownList ■■■超低价出售自主开发的ASP.NET+C#客户服务系统,任意下载演示■■■ 使用用户控件的问题 关于接口的基础问题?
粗略看了一下
所有数据库连接的地方都只open,不close
时间长了,不光是内存泄露问题,你数据库连接池满了,就再也连不上数据库了
2.安全一点说,凡是实现了IDispose接口的,都要考虑释放问题。比如timer,DirectoryEntry,SqlConnection
3.带界面的服务虽然说不出有什么问题,但感觉不对反正少见
弄到方法外面,会出现不确定的问题,比如你如果用到了sqlDataReader,这个是需要独占一个连接的,但读取速度非常快
{
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;
}
不要强制干涉去close和dispose. 让系统自动的去释放!