如何停止定时器在windows服务,使代码不会击中多次

本文关键字:代码 定时器 何停止 windows 服务 | 更新日期: 2023-09-27 18:15:20

这是一个示例控制台应用程序,而不是原来的WINDOWS服务

我有下面的代码(仅示例代码)。我希望我的计时器应该只执行一次,之后应该停止。

目前我正在使用count字段来检查代码是否已经命中。它工作得很好,但我想优化的东西。

注意:使用定时器的原因是在安装windows服务的过程中,OnStart事件不应该延迟服务的安装过程。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    static class Program
    {
        static int count = 0;
        static void Main()
        {
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Elapsed += OnElapseTime;
            timer.Interval = TimeSpan.FromSeconds(5).TotalMilliseconds;
            timer.Start();
            System.Threading.Thread.Sleep(30000);
            timer.Stop();
        }
        static void OnElapseTime(object sender,
                                          System.Timers.ElapsedEventArgs e)
        {
            if (count < 1)
            {
                count++;
                Console.WriteLine("Timer ticked...");
                Console.ReadLine();
            }
        }
    }
}

如何停止定时器在windows服务,使代码不会击中多次

将AutoReset设置为false即可。这将导致事件只触发一次。您可以使用count删除代码。

timer.AutoReset = false;

有多种方法可以实现您想要的,这本质上是延迟执行。

最简单的修改方法可能是这样的:

static void Main()
{
   System.Timers.Timer timer = new System.Timers.Timer();
   timer.Elapsed += OnElapseTime;
   timer.Interval = TimeSpan.FromSeconds(5).TotalMilliseconds;
   timer.Start();
}
static void OnElapseTime(object sender, System.Timers.ElapsedEventArgs e)
{
    var timer = (System.Timers.Timer)sender;
    timer.Stop();  // stop the timer after first run
    // do the work.. (be careful, this is running on a background thread)
    Console.WriteLine("Timer ticked...");
    Console.ReadLine();            
} 

另一种方法可能是使用System.Threading.Timer类而不是System.Timers.Timer,并安排一次延迟执行:

static void Main()
{
   var timer = new System.Threading.Timer(RunDelayed, null, imeSpan.FromSeconds(5).TotalMilliseconds, Timeout.Infinite );
}
private void Callback( Object state )
{
    // do the work.. (be careful, this is running on a background thread)
    Console.WriteLine("Timer ticked...");
    Console.ReadLine(); 
}

这里有一篇很好的文章,讨论了。net中不同定时器类之间的差异:https://web.archive.org/web/20150329101415/https://msdn.microsoft.com/en-us/magazine/cc164015.aspx