winform执行程序越来越慢

sunnin123 2011-09-29 09:25:16
小弟刚刚接触winform的东西,用timer控件执行一个方法,去发送邮件,可是程序运行一段时间之后,就越来越慢,到最后不执行了。。。实在不知道问题出在哪。所以恳请高手帮帮忙,指点我这个菜鸟一下。。。万分感激。
Form1_Load部分:

private void Form1_Load(object sender, EventArgs e)
{
System.Timers.Timer aTimer = new System.Timers.Timer();

aTimer.Elapsed += new ElapsedEventHandler(TimeEvent);
// 设置引发事件的时间间隔 此处设置为1秒(1000毫秒)
aTimer.AutoReset = true;
aTimer.Interval = 60000;
aTimer.Enabled = true;
aTimer.Start();
}

方法部分:
        private static void TimeEvent(object source, ElapsedEventArgs e)
{


#region 每分钟查看数据库。

string sql = "select * from EMS_System_Admin where e_system_admin_mark = 1 "
+ "select * from EMS_Email where e_email_state = 0 order by e_email_time desc "
+ "select e_mode_guid,e_mode_content,e_mode_name from EMS_Mode "
+ "select (select count(*) from EMS_Email where convert(char(19),EMS_Email.e_email_time,120) = convert(char(19),EMS_ERemind.e_eremind_sortime,120) and e_email_state = 0)st,(select count(*) from EMS_Email where e_email_state = 1 and convert(char(19),EMS_Email.e_email_time,120) = convert(char(19),EMS_ERemind.e_eremind_sortime,120))success,(select count(*) from EMS_Email where e_email_state = 2 and convert(char(19),EMS_Email.e_email_time,120) = convert(char(19),EMS_ERemind.e_eremind_sortime,120))failure,(select top 1 e_email_sort from EMS_Email where convert(char(19),EMS_Email.e_email_time,120) = convert(char(19),EMS_ERemind.e_eremind_sortime,120))sort,(select top 1 e_email_project from EMS_Email where convert(char(19),EMS_Email.e_email_time,120) = convert(char(19),EMS_ERemind.e_eremind_sortime,120))project,* from EMS_ERemind";


DataSet DS = MiracleEMS.DataBase.SqlHelper.DS(sql, null);

DataTable dt = DS.Tables[0];
DataTable dt1 = DS.Tables[1];

DataTable dt2 = DS.Tables[2];
DataTable dt3 = DS.Tables[3];


string[] arrEmail = new string[] { "12345678@qq.com" };
string strEmailTime = "";

string strSort = "";
string strProject = "";
int intCount = dt1.Rows.Count;
int r = 0;
string strMode = "";
string strModeTitle = "";
foreach (DataRow dr in dt.Rows)
{
r = 0;
foreach (DataRow dr1 in dt1.Rows)
{
if (dr["e_system_admin_guid"].ToString().ToLower() == dr1["e_email_oper"].ToString().ToLower())
{
if (r < 3)
{
r = r + 1;
arrEmail = new string[] { dr1["e_email_email"].ToString() };

try
{
foreach (DataRow dr3 in dt2.Rows)
{

if (dr1["e_email_begin"].ToString() == "")
{
if (dr1["e_email_mode"].ToString() == dr3["e_mode_guid"].ToString())
{
try
{
if (dr["e_system_admin_email"] != null && arrEmail != null)
{
if (BaseDo.SendEmail(dr["e_system_admin_email"].ToString(), dr["e_system_admin_name"].ToString(), arrEmail, dr3["e_mode_content"].ToString().Replace("XXX", dr1["e_email_name"].ToString()).Replace("{E_Email_Email}", dr1["e_email_email"].ToString()), dr3["e_mode_name"].ToString(), dr["e_system_admin_server"].ToString(), dr["e_system_admin_mailpwd"].ToString()))
{
MiracleEMS.DataBase.SqlHelper.SqlCmd("Update EMS_Email set e_email_state = 1 where e_email_guid='" + dr1["e_email_guid"].ToString() + "'", null);
}
else
{
MiracleEMS.DataBase.SqlHelper.SqlCmd("Update EMS_Email set e_email_state = 2 where e_email_guid='" + dr1["e_email_guid"].ToString() + "'", null);
}
}
}
catch
{
MiracleEMS.DataBase.SqlHelper.SqlCmd("Update EMS_Email set e_email_state = 2 where e_email_guid='" + dr1["e_email_guid"].ToString() + "'", null);
}

}
}
else
{

}
}

}
catch
{
continue;
}
}
else
{
continue;
}
}

}
r = 0;
arrEmail = new string[] { dr["e_system_admin_email"].ToString() };
}

dt3 = DS.Tables[3];
foreach (DataRow drs in dt3.Rows)
{
if (int.Parse(drs["st"].ToString()) == 0)
{

if (MiracleEMS.DataBase.SqlHelper.ExecuteNonQuery("declare @s int set @s = (select count(*) from EMS_Email where e_email_state = 1 and convert(char(19),EMS_Email.e_email_time,120) = '" + string.Format("{0:yyyy-MM-dd HH:mm:ss}", drs["e_eremind_sortime"]) + "') declare @f int set @f =(select count(*) from EMS_Email where e_email_state = 2 and convert(char(19),EMS_Email.e_email_time,120) = '" + string.Format("{0:yyyy-MM-dd HH:mm:ss}", drs["e_eremind_sortime"]) + "') declare @i int set @i = (select count(*) from EMS_Count where e_count_sortime = '" + string.Format("{0:yyyy-MM-dd HH:mm:ss}", drs["e_eremind_sortime"]) + "') if @i < 1 begin Insert Into EMS_Count(e_count_success,e_count_failure,e_count_sortime,e_count_sort,e_count_project) values(@s,@f,'" + drs["e_eremind_sortime"].ToString() + "','" + drs["sort"].ToString() + "','" + drs["project"].ToString() + "') end") > 0)
{
BaseDo.SendEmail("miracle.sun@imforce.com.cn", "您在" + drs["e_eremind_sortime"].ToString() + "的时间导入的Email发送完成", arrEmail, "成功数:" + drs["success"].ToString() + "<br />失败数:" + drs["failure"].ToString(), "您在" + drs["e_eremind_sortime"].ToString() + "的时间导入的Email发送完成", "mail.imforce.com.cn", "12345678");
}
}
}

}

...全文
562 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunnin123 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 wjfwd2009 的回复:]
还有你的SQLH。DL方法里数据库连接不需要关闭了,这样一关一开很消耗性能,不知道你的帮助类怎么写的
[/Quote]

谢谢。
sunnin123 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 mabaolin 的回复:]
看了一下,有两个可能:
1、可能性大 while (this.falg)
{
this.monitor.CallBackFun("ereR");

Thread.Sleep(3000);、//时间小了,造成同时执行callbackfun越来越多
}
2、可能性小:
BaseDo.SendEmail();
MiracleEMS.DataBase.SqlHelpe……
[/Quote]

有没有一种可能是,因为程序未执行完,然后导致程序拥堵而导致崩溃。
或者有没有可能是因为内存需要释放呢?timer控件需要在每次循环执行完毕之后释放资源吗
sunnin123 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wjfwd2009 的回复:]
datatable里面有一个叫语法糖的东西,你可以研究研究或许能优化一下你的代码,不需要循环判断你想要的数据,而是直接把等于,或者不等于这个值的数据取出来。
[/Quote]


谢谢,稍后会找些这方面的资料看。。。winform知识还是很不足,我第一次写。。。
mabaolin 2011-09-29
  • 打赏
  • 举报
回复
程序和我同事有得一拼(不过人家不是计算专业的)。
mabaolin 2011-09-29
  • 打赏
  • 举报
回复
看了一下,有两个可能:
1、可能性大 while (this.falg)
{
this.monitor.CallBackFun("ereR");

Thread.Sleep(3000);、//时间小了,造成同时执行callbackfun越来越多
}
2、可能性小:
BaseDo.SendEmail();
MiracleEMS.DataBase.SqlHelper.SqlCmd()是第三方lib文件? 有内存泄漏?

无论哪种,只需把调用basedo.sendemail和MiracleEMS.DataBase.SqlHelper.SqlCmd的地方屏蔽掉。
或者增大sleep时间为30s或更长,取决于CallBackFun的执行时间长短。可以在CallBackFun的入口和出口加入时间判断,看看执行时间。
xfxlylove 2011-09-29
  • 打赏
  • 举报
回复
你创建的对象都手动干掉看看
wjfwd2009 2011-09-29
  • 打赏
  • 举报
回复
datatable里面有一个叫语法糖的东西,你可以研究研究或许能优化一下你的代码,不需要循环判断你想要的数据,而是直接把等于,或者不等于这个值的数据取出来。
sunnin123 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wjfwd2009 的回复:]
try catch肯定会影响你的代码效率,这还用问?,而且你看看你写的代码多少个循环多少个IF这样的代码要事让我领导看见了我就可以打包走人了,循环多不可怕,可怕的是循环里嵌套循环,再嵌套循环
[/Quote]

稍后会做出代码优化,目前只想搞清楚崩溃的原因,只是初步写的实例而已。。。先不那么讲究。。
wjfwd2009 2011-09-29
  • 打赏
  • 举报
回复
try catch肯定会影响你的代码效率,这还用问?,而且你看看你写的代码多少个循环多少个IF这样的代码要事让我领导看见了我就可以打包走人了,循环多不可怕,可怕的是循环里嵌套循环,再嵌套循环
sdl2005lyx 2011-09-29
  • 打赏
  • 举报
回复
这代码写得。。。。
sunnin123 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 icedmilk 的回复:]
一段时间是多久?
[/Quote]

1小时左右吧。。。或者长一点。。。具体时间说不好呢
cf_nxcxy 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ssp2009 的回复:]
看看内存使用率
[/Quote]
嗯嗯
Icedmilk 2011-09-29
  • 打赏
  • 举报
回复
一段时间是多久?

sunnin123 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wangjun8868 的回复:]
try{} catch 都去掉
[/Quote]

为什么
编程有钱人了 2011-09-29
  • 打赏
  • 举报
回复
try{} catch 都去掉
sunnin123 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ssp2009 的回复:]
任务管理器你不会看?
[/Quote]

会,但是我不会看什么样是内存在增加。。。
快溜 2011-09-29
  • 打赏
  • 举报
回复
任务管理器你不会看?
sunnin123 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ssp2009 的回复:]
看看内存使用率
[/Quote]

我不会看啊。。。您能教我一下吗?
快溜 2011-09-29
  • 打赏
  • 举报
回复
看看内存使用率
garfieldzf 2011-09-29
  • 打赏
  • 举报
回复
Windbg跟一下。 看看那些信息对你有帮助。

timer并不是好用的东西。
加载更多回复(5)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧