如何在Windows服务中停止计时器,以便代码不会多次出现?

时间:2015-10-01 05:51:58

标签: c# timer windows-services

这是示例控制台应用程序而不是原始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();
            }

        }
    }
}

2 个答案:

答案 0 :(得分:3)

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

timer.AutoReset = false;

答案 1 :(得分:1)

有多种方法可以实现您的目标,这实际上是延迟执行。

最简单的修改内容可能是这样的:

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();            
} 

Antoher approcah可能是使用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