Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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#_.net - Fatal编程技术网

C# 任务执行时间高于计时器执行时间

C# 任务执行时间高于计时器执行时间,c#,.net,C#,.net,我想澄清一下可能的代码实现,以防在timerDoJob_经过时执行的代码越来越长。 所以当下次定时器启动时,所有内部的东西都会被加高/取消等等 这种问题有什么模式吗? 关于让它更稳定有什么线索吗 private void timerDoJob_Elapsed(object sender, ElapsedEventArgs e) { VeryLongTask1(); VeryLongTask2(); VeryLongTask3(); } 如果您正在使用,请关闭。然后

我想澄清一下可能的代码实现,以防在
timerDoJob_经过时执行的代码越来越长。
所以当下次定时器启动时,所有内部的东西都会被加高/取消等等

这种问题有什么模式吗? 关于让它更稳定有什么线索吗

private void timerDoJob_Elapsed(object sender, ElapsedEventArgs e)
{
     VeryLongTask1();
     VeryLongTask2();
     VeryLongTask3();
}
如果您正在使用,请关闭。然后在已用方法结束时重新启用计时器

private void timerDoJob_Elapsed(object sender, ElapsedEventArgs e)
{
    VeryLongTask1();
    VeryLongTask2();
    VeryLongTask3();
    mytimer.Enabled = true;
}
这样,在任务完成之前,计时器甚至不会再次启动。但请确保将已用方法中的所有内容包装在try/catch块中,因为如果在那里发生未处理的异常,计时器将不会再次启动

我以前使用过的另一种方法是在经过的事件中使用锁:

var myLock = new Object();
private void timerDoJob_Elapsed(object sender, ElapsedEventArgs e)
{
    lock (myLock) {
     VeryLongTask1();
     VeryLongTask2();
     VeryLongTask3();
    }
}
这样,已用事件的两个实例不能同时运行。但是,有一个警告:如果任务需要两次或更多的计时器迭代,那么您可以在后台进行迭代。例如,如果您的计时器在5秒后过期,但您的任务需要60秒才能完成,到第一个计时器完成时,您将有11个计时器等待。

如果您正在使用,请关闭。然后在已用方法结束时重新启用计时器

private void timerDoJob_Elapsed(object sender, ElapsedEventArgs e)
{
    VeryLongTask1();
    VeryLongTask2();
    VeryLongTask3();
    mytimer.Enabled = true;
}
这样,在任务完成之前,计时器甚至不会再次启动。但请确保将已用方法中的所有内容包装在try/catch块中,因为如果在那里发生未处理的异常,计时器将不会再次启动

我以前使用过的另一种方法是在经过的事件中使用锁:

var myLock = new Object();
private void timerDoJob_Elapsed(object sender, ElapsedEventArgs e)
{
    lock (myLock) {
     VeryLongTask1();
     VeryLongTask2();
     VeryLongTask3();
    }
}
这样,已用事件的两个实例不能同时运行。但是,有一个警告:如果任务需要两次或更多的计时器迭代,那么您可以在后台进行迭代。例如,如果您的计时器在5秒后过期,但您的任务需要60秒才能完成,到第一个计时器完成时,您将有11个等待时间。

方法将
Timeout.Infinite
0
作为参数将停止计时器(从MSDN):

如果dueTime为零(0),则立即调用回调方法。如果 dueTime是Timeout.Infinite,永远不会调用回调方法;这个 计时器已禁用,但可以通过调用Change和 指定dueTime的正值

一种可能且简单但功能强大的方法是停止计时器,直到整个任务结束,然后再次启动计时器:

private void timerDoJob_Elapsed(object sender, ElapsedEventArgs e)
{
     timerDoJob.Change(Timeout.Infinite, 0);

     // Use a try-finally so if some tasks throws an exception
     // the timer will be re-enabled again anyway
     try
     {
        VeryLongTask1();
        VeryLongTask2();
        VeryLongTask3();
     }
     finally
     {
         timerDoJob.Change(0, 5000);
     }
}
方法将
Timeout.Infinite
0
作为参数,将停止计时器(来自MSDN):

如果dueTime为零(0),则立即调用回调方法。如果 dueTime是Timeout.Infinite,永远不会调用回调方法;这个 计时器已禁用,但可以通过调用Change和 指定dueTime的正值

一种可能且简单但功能强大的方法是停止计时器,直到整个任务结束,然后再次启动计时器:

private void timerDoJob_Elapsed(object sender, ElapsedEventArgs e)
{
     timerDoJob.Change(Timeout.Infinite, 0);

     // Use a try-finally so if some tasks throws an exception
     // the timer will be re-enabled again anyway
     try
     {
        VeryLongTask1();
        VeryLongTask2();
        VeryLongTask3();
     }
     finally
     {
         timerDoJob.Change(0, 5000);
     }
}

你是在问如果任务持续太久怎么取消吗?@SamIam不,我不是。事实上,一项任务应该及时完成,但下一个计时器的迭代不应该破坏以前的东西。你是在问如果任务持续太久怎么取消它吗?@SamIam不,我不是。实际上,一项任务应该及时完成,但下一个计时器的迭代不应该破坏以前的东西。