专家!
我正在用 C# 开发 Windows 服务。我的问题是我的服务在上一个操作结束之前重新启动计时器。 例如:
timer.Interval = 60000;
timer.Elapsed += new ElapsedEventHandler(this.ImportXML);
timer.Start();
我的计时器设置为 1 小时。但如果我的主要方法(ImportXML)尚未完成,计时器将重新启动并再次启动主要方法。
如何等待我的方法完成才能再次开始(重新启动计时器)。
谢谢大家!
我尝试搜索其他解决方案以使用计时器等待我的主要方法结束
您可以使用外部布尔字段来跟踪计时器处理程序是否已在运行,如果前一个处理程序仍在运行,则退出。
TimerHandler
检查前一个是否仍在运行,如果是则退出,它将在下一个时间间隔再次运行。锁是因为处理程序在单独的线程中运行,因此为了防止多个处理程序接触同一个 _timerHandlerRunning
变量的竞争条件,您使用锁,这样一次只能运行一个。
class Program
{
private static readonly object _timerHandlerLock = new object();
private static bool _timerHandlerRunning;
static void Main(string[] args)
{
var timer = new System.Timers.Timer();
timer.Interval = 1000;
timer.Elapsed += new ElapsedEventHandler(TimerHandler);
timer.Start();
Console.ReadLine();
}
public static void TimerHandler(object source, ElapsedEventArgs e)
{
Console.WriteLine("Enter timer handler");
lock (_timerHandlerLock)
{
if (_timerHandlerRunning)
{
Console.WriteLine("Previous handler still running, returning");
return;
}
_timerHandlerRunning = true;
}
try
{
Console.WriteLine("Importing xml");
ImportXML();
}
finally
{
lock (_timerHandlerLock)
{
_timerHandlerRunning = false;
}
}
Console.WriteLine("Exiting timer handler");
}
public static void ImportXML()
{
Thread.Sleep(2000);
}
}