Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在每个月底点燃计时器c#_C#_Timer - Fatal编程技术网

在每个月底点燃计时器c#

在每个月底点燃计时器c#,c#,timer,C#,Timer,我需要在每个月底定时点火。 我写了一个小程序,其中的代码需要在每个月的最后一天执行,我不知道如何实现它。我建议我的老板使用windows调度程序,但他希望用带有计时器的代码来完成 那我该怎么做呢 我设法说服老板使用windows计划任务。有一种方法可以通过定时器来实现这一点。我将代码包括在下面。它又快又脏。请注意,使用计划任务是实现此类任务的正确方法 private Timer timer; public MyClass() { timer = new

我需要在每个月底定时点火。 我写了一个小程序,其中的代码需要在每个月的最后一天执行,我不知道如何实现它。我建议我的老板使用windows调度程序,但他希望用带有计时器的代码来完成


那我该怎么做呢

我设法说服老板使用windows计划任务。有一种方法可以通过定时器来实现这一点。我将代码包括在下面。它又快又脏。请注意,使用计划任务是实现此类任务的正确方法

    private Timer timer;

    public MyClass()
    {
        timer = new Timer();
        timer.Elapsed += TimerElapsed;
    }

    private void TimerElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
    {

        if (DateTime.Now.Day == DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month))// is it the last day of this month
        {
            ClientStatsController.FireAll();
        }

        Thread.Sleep(TimeSpan.FromMinutes(5));
        timer.Interval = CalculateInterval();
        TimeSpan interval = new TimeSpan(0, 0, 0, 0, (int)timer.Interval);

    }

    // Helper functions
    private static TimeSpan From24HourFormat(string value)
    {
        int hours = Convert.ToInt32(value.Substring(0, 2));
        int mins = Convert.ToInt32(value.Substring(2, 2));

        return TimeSpan.FromHours(hours) + TimeSpan.FromMinutes(mins);
    }

    private double CalculateInterval()
    {
        string runtimeValue = ConfigController.AppSettings["runTime"]; // just a simple runtime string like 0800
        double runTime = From24HourFormat(runtimeValue).TotalMilliseconds;
        if (DateTime.Now.TimeOfDay.TotalMilliseconds < runTime)
        {
            return runTime - DateTime.Now.TimeOfDay.TotalMilliseconds;
        }
        else
        {
            return (From24HourFormat("2359").TotalMilliseconds - DateTime.Now.TimeOfDay.TotalMilliseconds) + runTime;
        }
    }
专用定时器;
公共MyClass()
{
定时器=新定时器();
timer.appeased+=timerecursed;
}
私有void timerecursed(对象发送方,ElapsedEventArgs ElapsedEventArgs)
{
如果(DateTime.Now.Day==DateTime.DaysInMonth(DateTime.Now.Year,DateTime.Now.Month))//这是本月的最后一天吗
{
clientstatcontroller.FireAll();
}
睡眠(时间跨度从分钟(5));
timer.Interval=CalculateInterval();
TimeSpan interval=新的TimeSpan(0,0,0,0,(int)timer.interval);
}
//辅助函数
从24小时格式(字符串值)开始的专用静态时间跨度
{
整小时=转换为32(值。子字符串(0,2));
int mins=Convert.ToInt32(value.Substring(2,2));
返回时间跨度从小时(小时)+时间跨度从分钟(分钟);
}
私有双计算区间()
{
string runtimeValue=ConfigController.AppSettings[“runTime”];//只是一个简单的运行时字符串,如0800
double runTime=From24HourFormat(runtimeValue).total毫秒;
if(DateTime.Now.TimeOfDay.TotalMillicles<运行时)
{
返回runTime-DateTime.Now.TimeOfDay.totalmillizes;
}
其他的
{
返回(从24hourformat(“2359”).totalmillizes-DateTime.Now.TimeOfDay.totalmillizes)+运行时;
}
}
编辑

我开始复习我以前的问题和答案

使用计时器是一个非常糟糕的主意。对于计划任务,您希望使用exaclty。调度程序。Windows提供了一个不错的任务调度器,但如果您有更复杂的调度逻辑和后台任务,最好使用合适的第三方库

NET的两个突出的版本是Hangfire和Quartz

Hangfire配有一个仪表板,非常容易实现,尤其是在.NET核心平台上工作时

石英也是一个非常好的解决方案,它有更多的调度选项,比Hangfire更适合复杂的调度逻辑


提出的解决方案确实是一个非常糟糕的问题,来自一个刚刚开始工作的实习生。我很高兴能回到过去,认识到如何以不同的方式更好地完成工作。

我设法说服老板使用windows计划任务。有一种方法可以通过定时器来实现这一点。我将代码包括在下面。它又快又脏。请注意,使用计划任务是实现此类任务的正确方法

    private Timer timer;

    public MyClass()
    {
        timer = new Timer();
        timer.Elapsed += TimerElapsed;
    }

    private void TimerElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
    {

        if (DateTime.Now.Day == DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month))// is it the last day of this month
        {
            ClientStatsController.FireAll();
        }

        Thread.Sleep(TimeSpan.FromMinutes(5));
        timer.Interval = CalculateInterval();
        TimeSpan interval = new TimeSpan(0, 0, 0, 0, (int)timer.Interval);

    }

    // Helper functions
    private static TimeSpan From24HourFormat(string value)
    {
        int hours = Convert.ToInt32(value.Substring(0, 2));
        int mins = Convert.ToInt32(value.Substring(2, 2));

        return TimeSpan.FromHours(hours) + TimeSpan.FromMinutes(mins);
    }

    private double CalculateInterval()
    {
        string runtimeValue = ConfigController.AppSettings["runTime"]; // just a simple runtime string like 0800
        double runTime = From24HourFormat(runtimeValue).TotalMilliseconds;
        if (DateTime.Now.TimeOfDay.TotalMilliseconds < runTime)
        {
            return runTime - DateTime.Now.TimeOfDay.TotalMilliseconds;
        }
        else
        {
            return (From24HourFormat("2359").TotalMilliseconds - DateTime.Now.TimeOfDay.TotalMilliseconds) + runTime;
        }
    }
专用定时器;
公共MyClass()
{
定时器=新定时器();
timer.appeased+=timerecursed;
}
私有void timerecursed(对象发送方,ElapsedEventArgs ElapsedEventArgs)
{
如果(DateTime.Now.Day==DateTime.DaysInMonth(DateTime.Now.Year,DateTime.Now.Month))//这是本月的最后一天吗
{
clientstatcontroller.FireAll();
}
睡眠(时间跨度从分钟(5));
timer.Interval=CalculateInterval();
TimeSpan interval=新的TimeSpan(0,0,0,0,(int)timer.interval);
}
//辅助函数
从24小时格式(字符串值)开始的专用静态时间跨度
{
整小时=转换为32(值。子字符串(0,2));
int mins=Convert.ToInt32(value.Substring(2,2));
返回时间跨度从小时(小时)+时间跨度从分钟(分钟);
}
私有双计算区间()
{
string runtimeValue=ConfigController.AppSettings[“runTime”];//只是一个简单的运行时字符串,如0800
double runTime=From24HourFormat(runtimeValue).total毫秒;
if(DateTime.Now.TimeOfDay.TotalMillicles<运行时)
{
返回runTime-DateTime.Now.TimeOfDay.totalmillizes;
}
其他的
{
返回(从24hourformat(“2359”).totalmillizes-DateTime.Now.TimeOfDay.totalmillizes)+运行时;
}
}
编辑

我开始复习我以前的问题和答案

使用计时器是一个非常糟糕的主意。对于计划任务,您希望使用exaclty。调度程序。Windows提供了一个不错的任务调度器,但如果您有更复杂的调度逻辑和后台任务,最好使用合适的第三方库

NET的两个突出的版本是Hangfire和Quartz

Hangfire配有一个仪表板,非常容易实现,尤其是在.NET核心平台上工作时

石英也是一个非常好的解决方案,它有更多的调度选项,比Hangfire更适合复杂的调度逻辑


提出的解决方案确实是一个非常糟糕的问题,来自一个刚刚开始工作的实习生。我很高兴回到过去,认识到事情可以做得更好更好。

不要为此使用计时器(即使你的老板坚持这样做,这完全是愚蠢的;计时器是几秒钟或几分钟的,而不是一个月一次……)。使用Windows scheduled tasks功能在每个月底启动一次你的应用程序……除非你的老板没有任何线索,否则他可能有充分的理由。试着找出原因是什么;这可能会导致您不知道的其他需求。(例如:他不相信运营部门会维持计划的ta