解决方案 »

  1.   

    dottrace,这个用起来比较简单
    注意看下你是不是大量的拼接字符串导致GC回收频繁(这问题我印象太深刻了……)
      

  2.   


    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类。请你帮我看看是这个导致的吗?如果是,如何修改,谢谢。
      

  3.   

    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)
                {
                  
                }
            }
      

  4.   

    任务数很多吗?单从你的代码,Test2_DoWork只要执行时间不是特别长(短任务),是不会有问题的
      

  5.   

    BackgroundWorker用的是线程池线程
      

  6.   

    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),另外需要一个定时器,判别队列中哪些任务到了执行时间,然后执行就行了
      

  7.   

    首先3楼整段的代码到底写哪了就很值得疑惑
    如果你在timer里不断执行这段代码,很可能造成前面的任务还没有执行,(线程当然也并没有结束),后续任务就不断的添加进队列里
      

  8.   

    CPU高的话,那么你在调试的时候应该也高啊,调试查一查
    也看看是不是有的资源没有释放
    ------------------------------------------------------------------------------------------------
    请为参加博客之星的我投上一票感激之至
      

  9.   

    我猜也是有可能有些资源没有释放,但是在看资源有没有释放呢?
    这个你需要检查你代码中用到的非托管对象  比如IO对象什么的,他们需要最后dispose掉
      

  10.   

    资源没释放应该是内存泄露吧,CPU高和内存有必然联系?
      

  11.   

    是在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(就是一句代码);
      

  12.   

    DoWork里就一句代码?那你真正执行任务又是用什么东西执行的
    你还是先写点伪代码出来告诉我们你这东西到底都干什么了
    不要放一大堆代码出来让我们自己分析了
      

  13.   

    不好意思,应该是最后一句代码把当前生成任务的队列修改为IsFinished=true(在此句代码之前的都是用来生成任务的代码),表示此生成任务的队列已经完成。下次timer启动时会把IsFinished=true的队列删除。