如何在Windows服务(C#)中创建等待main方法结束的TIMER

问题描述 投票:0回答:1

专家!

我正在用 C# 开发 Windows 服务。我的问题是我的服务在上一个操作结束之前重新启动计时器。 例如:

timer.Interval = 60000;
timer.Elapsed += new ElapsedEventHandler(this.ImportXML); 
timer.Start();

我的计时器设置为 1 小时。但如果我的主要方法(ImportXML)尚未完成,计时器将重新启动并再次启动主要方法。

如何等待我的方法完成才能再次开始(重新启动计时器)。

谢谢大家!

我尝试搜索其他解决方案以使用计时器等待我的主要方法结束

c# visual-studio service
1个回答
0
投票

您可以使用外部布尔字段来跟踪计时器处理程序是否已在运行,如果前一个处理程序仍在运行,则退出。

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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.