定时跑的window服务消耗CPU太高了,如何找原因? cpu高windows 服务 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 dottrace,这个用起来比较简单注意看下你是不是大量的拼接字符串导致GC回收频繁(这问题我印象太深刻了……) BackgroundWorker[] bgws = new BackgroundWorker[taskPlanTimers.Count]; for (int i = 0; i < taskPlanTimers.Count; i++) { TaskPlanTimer taskPlanTimer = taskPlanTimers[i]; TaskPlanTimer newTaskPlanTimer = null; TaskPlan taskPlan = taskPlanService.GetTaskPlanById(taskPlanTimer.TaskPlanId); newTaskPlanTimer = taskPlanTimer; taskPlanTimerService.UpdateTaskPlanTimer(taskPlanTimer); bgws[i] = new BackgroundWorker(); bgws[i].DoWork += new DoWorkEventHandler(Test2_DoWork); bgws[i].RunWorkerCompleted += Test2_RunWorkerCompleted; //启用线程 bgws[i].RunWorkerAsync(newTaskPlanTimer); }是有使用过BackgroundWorker类。请你帮我看看是这个导致的吗?如果是,如何修改,谢谢。 void Test2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs ex) { BackgroundWorker bg = (sender as BackgroundWorker); bg.Dispose(); if (ex.Error != null) { //write log to db } } void Test2_DoWork(object sender, DoWorkEventArgs e) { try { //to do sth } catch (Exception ex) { } } 任务数很多吗?单从你的代码,Test2_DoWork只要执行时间不是特别长(短任务),是不会有问题的 BackgroundWorker用的是线程池线程 TaskPlanTimer taskPlanTimer = taskPlanTimers[i]; TaskPlanTimer newTaskPlanTimer = null; TaskPlan taskPlan = taskPlanService.GetTaskPlanById(taskPlanTimer.TaskPlanId);取出来之后再没用过? newTaskPlanTimer = taskPlanTimer; taskPlanTimerService.UpdateTaskPlanTimer(taskPlanTimer); bgws[i] = new BackgroundWorker(); bgws[i].DoWork += new DoWorkEventHandler(Test2_DoWork); bgws[i].RunWorkerCompleted += Test2_RunWorkerCompleted; //启用线程 bgws[i].RunWorkerAsync(newTaskPlanTimer);感觉你的逻辑有点乱,一般将任务放入一个队列(事实是你可以直接调用ThreadPool.QueueUserWork),另外需要一个定时器,判别队列中哪些任务到了执行时间,然后执行就行了 首先3楼整段的代码到底写哪了就很值得疑惑如果你在timer里不断执行这段代码,很可能造成前面的任务还没有执行,(线程当然也并没有结束),后续任务就不断的添加进队列里 CPU高的话,那么你在调试的时候应该也高啊,调试查一查也看看是不是有的资源没有释放------------------------------------------------------------------------------------------------请为参加博客之星的我投上一票感激之至 我猜也是有可能有些资源没有释放,但是在看资源有没有释放呢?这个你需要检查你代码中用到的非托管对象 比如IO对象什么的,他们需要最后dispose掉 资源没释放应该是内存泄露吧,CPU高和内存有必然联系? 是在timer里面,但是后续任务应该不会不断的添加进队列里,因为我通过了一个IsFinished来判断是不是需要添加新的任务到队列里面来的,IsFinished有三种状态,null:默认值,表示从数据库里面取出来的任务队列,false,表示这个任务队列正在生成任务,true:表示这个任务队列的生成任务已经完成,目前只有IsFinished=true才去数据库取新的任务队列。详细代码如下: private void TaskTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)//两分钟执行一次{ ITaskPlanTimerService taskPlanTimerService = EngineContext.Current.Resolve<ITaskPlanTimerService>(); ITaskPlanService taskPlanService = EngineContext.Current.Resolve<ITaskPlanService>(); IList<TaskPlanTimer> taskPlanTimers = taskPlanTimerService.GetAllTaskPlanTimers(); if (taskPlanTimers == null || taskPlanTimers.Count == 0) { this.TaskTimer.Enabled = true; EventLog.WriteEntry("目前尚无任务生成", EventLogEntryType.Information, (int)TaskEventType.Normal, (int)TaskEventCategory.Normal); return; } //IList<TaskPlanTimer> finishedTaskPlanTimers = taskPlanTimers.Where(x => x.IsFinished == true && x.IsLoopFinished == true).ToList(); IList<TaskPlanTimer> finishedTaskPlanTimers = taskPlanTimers.Where(x => x.IsFinished == true).ToList(); if (finishedTaskPlanTimers != null && finishedTaskPlanTimers.Count > 0) { foreach (TaskPlanTimer item in finishedTaskPlanTimers) { taskPlanTimerService.DeleteTaskPlanTimer(item); } } taskPlanTimers = taskPlanTimerService.GetAllTaskPlanTimers();// if (taskPlanTimers == null || taskPlanTimers.Count == 0) { this.TaskTimer.Enabled = true; EventLog.WriteEntry("删除完成计划后,目前尚无任务生成", EventLogEntryType.Information, (int)TaskEventType.Normal, (int)TaskEventCategory.Normal); return; } int generationTaskServerCount = Convert.ToInt32(ConfigurationManager.AppSettings["IntervalHoursForTempTask"].Trim()); int intervalHoursForTempTask = Convert.ToInt32(ConfigurationManager.AppSettings["IntervalHoursForTempTask"].Trim());IList<TaskPlanTimer> runningTaskPlanTimers = taskPlanTimers.Where(x => x.IsFinished == false).ToList(); IList<TaskPlanTimer> tmpTaskPlanTimers = taskPlanTimers.Where(x => (x.StartTime <= DateTime.Now.AddHours(intervalHoursForTempTask))).ToList();//是否有临时紧急的任务,提前生成。 if (tmpTaskPlanTimers == null || tmpTaskPlanTimers.Count == 0) //是否有临时紧急任务需要生成 { if (runningTaskPlanTimers != null && runningTaskPlanTimers.Count > 0)//当前的周期没有跑完 { EventLog.WriteEntry("当前服务正在生成任务, 只有本次循环计划生成完才能开始下次计划任务的生成!", EventLogEntryType.Information, (int)TaskEventType.Normal, (int)TaskEventCategory.Normal); this.TaskTimer.Enabled = true; return; } } else { taskPlanTimers = tmpTaskPlanTimers; } for (int k = 0; k < taskPlanTimers.Count; k++) { TaskPlanTimer taskPlanTimer = taskPlanTimers[k]; taskPlanTimer.IsFinished = false; taskPlanTimer.ServerNumber = serverNumber; taskPlanTimerService.UpdateTaskPlanTimer(taskPlanTimer); }BackgroundWorker[] bgws = new BackgroundWorker[taskPlanTimers.Count]; for (int i = 0; i < taskPlanTimers.Count; i++) { TaskPlanTimer taskPlanTimer = taskPlanTimers[i]; TaskPlanTimer newTaskPlanTimer = null; TaskPlan taskPlan = taskPlanService.GetTaskPlanById(taskPlanTimer.TaskPlanId); newTaskPlanTimer = taskPlanTimer; taskPlanTimerService.UpdateTaskPlanTimer(taskPlanTimer); bgws[i] = new BackgroundWorker(); bgws[i].DoWork += new DoWorkEventHandler(Test2_DoWork); bgws[i].RunWorkerCompleted += Test2_RunWorkerCompleted; //启用线程 bgws[i].RunWorkerAsync(newTaskPlanTimer); }}附:在这个里面Test2_DoWork把一个任务队列修改成IsFinished=true(就是一句代码); DoWork里就一句代码?那你真正执行任务又是用什么东西执行的你还是先写点伪代码出来告诉我们你这东西到底都干什么了不要放一大堆代码出来让我们自己分析了 不好意思,应该是最后一句代码把当前生成任务的队列修改为IsFinished=true(在此句代码之前的都是用来生成任务的代码),表示此生成任务的队列已经完成。下次timer启动时会把IsFinished=true的队列删除。 flash Upload 多文件上传 服务器上上传包 文件I/O错误 跪求大大帮忙 c#密码加密怎么解密 xml节点取值问题 为什么我用aspnetpager7.2不能动态查询分页 什么是web开发里的异步调用? C# IIS 一个关于updatepanle延迟更新的问题....在线等... treeview和iframe组合使用 在线等,急!!为何得不到动态生成的checkboxlist选中的值!!!? 进来看看? JS怎么实现自动分页呢?高手过来看看 2008R2服务器上,老是报错这个,不知道是代码的问题,还是iis的问题。
注意看下你是不是大量的拼接字符串导致GC回收频繁(这问题我印象太深刻了……)
BackgroundWorker[] bgws = new BackgroundWorker[taskPlanTimers.Count];
for (int i = 0; i < taskPlanTimers.Count; i++)
{
TaskPlanTimer taskPlanTimer = taskPlanTimers[i];
TaskPlanTimer newTaskPlanTimer = null;
TaskPlan taskPlan = taskPlanService.GetTaskPlanById(taskPlanTimer.TaskPlanId);
newTaskPlanTimer = taskPlanTimer;
taskPlanTimerService.UpdateTaskPlanTimer(taskPlanTimer);
bgws[i] = new BackgroundWorker();
bgws[i].DoWork += new DoWorkEventHandler(Test2_DoWork);
bgws[i].RunWorkerCompleted += Test2_RunWorkerCompleted;
//启用线程
bgws[i].RunWorkerAsync(newTaskPlanTimer);
}是有使用过BackgroundWorker类。请你帮我看看是这个导致的吗?如果是,如何修改,谢谢。
{
BackgroundWorker bg = (sender as BackgroundWorker);
bg.Dispose();
if (ex.Error != null)
{
//write log to db
}
}
void Test2_DoWork(object sender, DoWorkEventArgs e)
{
try
{
//to do sth
}
catch (Exception ex)
{
}
}
TaskPlanTimer newTaskPlanTimer = null;
TaskPlan taskPlan = taskPlanService.GetTaskPlanById(taskPlanTimer.TaskPlanId);
取出来之后再没用过?
newTaskPlanTimer = taskPlanTimer;
taskPlanTimerService.UpdateTaskPlanTimer(taskPlanTimer);
bgws[i] = new BackgroundWorker();
bgws[i].DoWork += new DoWorkEventHandler(Test2_DoWork);
bgws[i].RunWorkerCompleted += Test2_RunWorkerCompleted;
//启用线程
bgws[i].RunWorkerAsync(newTaskPlanTimer);感觉你的逻辑有点乱,一般将任务放入一个队列(事实是你可以直接调用ThreadPool.QueueUserWork),另外需要一个定时器,判别队列中哪些任务到了执行时间,然后执行就行了
如果你在timer里不断执行这段代码,很可能造成前面的任务还没有执行,(线程当然也并没有结束),后续任务就不断的添加进队列里
也看看是不是有的资源没有释放
------------------------------------------------------------------------------------------------
请为参加博客之星的我投上一票感激之至
这个你需要检查你代码中用到的非托管对象 比如IO对象什么的,他们需要最后dispose掉
详细代码如下:
private void TaskTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)//两分钟执行一次
{
ITaskPlanTimerService taskPlanTimerService = EngineContext.Current.Resolve<ITaskPlanTimerService>();
ITaskPlanService taskPlanService = EngineContext.Current.Resolve<ITaskPlanService>();
IList<TaskPlanTimer> taskPlanTimers = taskPlanTimerService.GetAllTaskPlanTimers();
if (taskPlanTimers == null || taskPlanTimers.Count == 0)
{
this.TaskTimer.Enabled = true;
EventLog.WriteEntry("目前尚无任务生成", EventLogEntryType.Information, (int)TaskEventType.Normal, (int)TaskEventCategory.Normal);
return;
}
//IList<TaskPlanTimer> finishedTaskPlanTimers = taskPlanTimers.Where(x => x.IsFinished == true && x.IsLoopFinished == true).ToList();
IList<TaskPlanTimer> finishedTaskPlanTimers = taskPlanTimers.Where(x => x.IsFinished == true).ToList();
if (finishedTaskPlanTimers != null && finishedTaskPlanTimers.Count > 0)
{
foreach (TaskPlanTimer item in finishedTaskPlanTimers)
{
taskPlanTimerService.DeleteTaskPlanTimer(item);
}
}
taskPlanTimers = taskPlanTimerService.GetAllTaskPlanTimers();//
if (taskPlanTimers == null || taskPlanTimers.Count == 0)
{
this.TaskTimer.Enabled = true;
EventLog.WriteEntry("删除完成计划后,目前尚无任务生成", EventLogEntryType.Information, (int)TaskEventType.Normal, (int)TaskEventCategory.Normal);
return;
}
int generationTaskServerCount = Convert.ToInt32(ConfigurationManager.AppSettings["IntervalHoursForTempTask"].Trim());
int intervalHoursForTempTask = Convert.ToInt32(ConfigurationManager.AppSettings["IntervalHoursForTempTask"].Trim());
IList<TaskPlanTimer> runningTaskPlanTimers = taskPlanTimers.Where(x => x.IsFinished == false).ToList();
IList<TaskPlanTimer> tmpTaskPlanTimers = taskPlanTimers.Where(x => (x.StartTime <= DateTime.Now.AddHours(intervalHoursForTempTask))).ToList();//是否有临时紧急的任务,提前生成。
if (tmpTaskPlanTimers == null || tmpTaskPlanTimers.Count == 0) //是否有临时紧急任务需要生成
{
if (runningTaskPlanTimers != null && runningTaskPlanTimers.Count > 0)//当前的周期没有跑完
{
EventLog.WriteEntry("当前服务正在生成任务, 只有本次循环计划生成完才能开始下次计划任务的生成!", EventLogEntryType.Information, (int)TaskEventType.Normal, (int)TaskEventCategory.Normal);
this.TaskTimer.Enabled = true;
return;
}
}
else
{
taskPlanTimers = tmpTaskPlanTimers;
}
for (int k = 0; k < taskPlanTimers.Count; k++)
{
TaskPlanTimer taskPlanTimer = taskPlanTimers[k];
taskPlanTimer.IsFinished = false;
taskPlanTimer.ServerNumber = serverNumber;
taskPlanTimerService.UpdateTaskPlanTimer(taskPlanTimer);
}
BackgroundWorker[] bgws = new BackgroundWorker[taskPlanTimers.Count];
for (int i = 0; i < taskPlanTimers.Count; i++)
{
TaskPlanTimer taskPlanTimer = taskPlanTimers[i];
TaskPlanTimer newTaskPlanTimer = null;
TaskPlan taskPlan = taskPlanService.GetTaskPlanById(taskPlanTimer.TaskPlanId);
newTaskPlanTimer = taskPlanTimer;
taskPlanTimerService.UpdateTaskPlanTimer(taskPlanTimer);
bgws[i] = new BackgroundWorker();
bgws[i].DoWork += new DoWorkEventHandler(Test2_DoWork);
bgws[i].RunWorkerCompleted += Test2_RunWorkerCompleted;
//启用线程
bgws[i].RunWorkerAsync(newTaskPlanTimer);
}
}附:在这个里面Test2_DoWork把一个任务队列修改成IsFinished=true(就是一句代码);
你还是先写点伪代码出来告诉我们你这东西到底都干什么了
不要放一大堆代码出来让我们自己分析了