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