如何用C#实现在指定的时间段内计算相关数据!一天执行一次计算,但要在规定的时间段内。在计算开始之间检测CPU的使用率,如果CPu的使用率过大就把当天的计算任务延迟!如果延迟时间的是1天甚至几天,如何到实现把延迟的的计算时间和当天的计算任务分别进行计算呢?例如:今天是星期五,我要计算星期四的数据。如果今天计算机空闲就把星期四的数据计算后插入到数据库。这是计算空闲的空闲的情况下!如果今天机器不空闲,要把计算时间延迟到明天,也就是星期六!到星期六以后,计算机有空闲时间。就要把星期四、星期五的数据分别计算放到数据库中!计算的要以天为单位,就是星期六要插入点数据就是两条,是两天的记录!请问如何实现这一点!计算任务调度不能用T-SQLL去执行,因为计算任务的一些数据是十六进制,要取出数据进行转换后再进行的计算!
  希望大家给点建议,思路或者一些案例!谢谢!

解决方案 »

  1.   

    timer或者自循环,datetime.now,符合条件触发,否则推迟
      

  2.   

    你计算完成后,记录本次计算的时间到数据库。
    到下次计算的时候,先到数据库中读取上次计算的时间参数。
    这样你就知道,上次是什么时候计算的了。
    从上次的那天开始,一直计算到昨天就是你要的数据了。
    至于测量cpu是否繁忙,就自己找吧。
      

  3.   

    如果单纯从描述来看,感觉楼主想多了.很简单的问题,别弄复杂了.你只需每月初(或者直接一次生成N年的)每天排定一个当天的任务的记录例如:计算日     计算完成标识(0:未计算-1:已计算)
    2011/1/1   0
    2011/1/2   0如果今日是2011/1/1:
    今日CPU不繁忙,那么就计算所有任务"计算完成标识"为0的任务,最后把"计算完成标识"更新为1
    今日CPU繁忙,那么就不计算任务,不更新"计算完成标识"当到第二天2011/1/2时:
    同第一天的步骤判断.这样就实现了,当CPU繁重时,任务延迟的功能.
      

  4.   

    谢谢!Cpu使用率已经解决了!现在就是求一个计算的思路!
      

  5.   

    一、可以在数据库中建一个表,描述已经 计算过的数据的 日期(Data_Date)、计算该数据的日期等字段(ComputerDateTime);是否执行了数据(IsOperateData),执行操作时CPU平均占用率(CPUAvgRate)
    二、cpu是否繁忙:可以指定一个标准,比如1分钟内取60次cpu占用率的值,如果高于70%就算是繁忙,大致代码如下
    PerformanceCounter pm=new PerformanceCounter("Processor","%Processor Time","_Total");
    int i=0;
    float sumPerformence=0;
    while (i<60)
    {
       sumPerformentce+=pm.NextValue();
       Thread.Sleep(1000);
       i+=1;
    }
    三 主体代码结构
    if(sumPerforment/60<0.7)
    {
       //获取前边没有执行插入计算数据的天数和日期列表(包括今天)
       //操作数据库
       //写入记录
    }
    四、如何每天定时在某一个时段执行?假定是早5点-早6点间;假定是web程序;
    在Global中的Application_Start中写入如下代码,来启动定时管理器
    System.Threading.Timer timerHour;
     System.Threading.TimerCallback timerHours = new TimerCallback(GlobalIntervalExec.Run );
    int periodTime = 60 * 60 * 1000;
    timerHour = new System.Threading.Timer(timerHours, null, 20 * 60 * 1000, periodTime);
    GC.KeepAlive(timerHour);再新建定时管理器类
    public interface ISchedulerJob
        {
            void Execute();
        }    public class SchedulerConfiguration
        {
            private int sleepInterval;
            private ArrayList jobs = new ArrayList();
            public int SleepInterval
            {
                get { return sleepInterval; }
            }
            public ArrayList Jobs
            {
                get { return jobs; }
            }
            public SchedulerConfiguration(int newSleepInterval)
            {
                sleepInterval = newSleepInterval;
            }
        }    public class Scheduler
        {
            private SchedulerConfiguration configuration = null;
            public Scheduler(SchedulerConfiguration config)
            {
                configuration = config;
            }
            public void Start()
            {
                while (true)
                {
                    try
                    {
                        foreach (ISchedulerJob job in configuration.Jobs)
                        {
                            job.Execute();
                        }                }
                    catch { }
                    finally
                    {
                        Thread.Sleep(configuration.SleepInterval);
                    }
                }
            }
        }
    用这个类来管理定时执行;当然你执行数据库操作的类要实现ISchedulerJob借口