C# 避免重入的定时器 封装为类

using System;  
using System.Timers;  
  
public class SafeTimer  
{  
    private Timer timer;  
    private bool isProcessing = false; // 标志位,确保方法不会重入  
  
    public SafeTimer(double interval, Action action)  
    {  
        // 初始化定时器,但不启动  
        timer = new Timer(interval * 1000); // 将秒转换为毫秒  
        timer.Elapsed += (sender, e) => OnTimerElapsed(action);  
        timer.AutoReset = true; // 设置定时器每次达到时间间隔后是否重置  
    }  
  
    public void Start()  
    {  
        timer.Start(); // 启动定时器  
    }  
  
    public void Stop()  
    {  
        timer.Stop(); // 停止定时器  
    }  
  
    private void OnTimerElapsed(Action action)  
    {  
        if (isProcessing)  return;  
        try  
        {  
            isProcessing = true; // 设置标志位为true,表示方法正在执行中,避免重入  
            action(); // 执行指定的操作  
        }  
        catch (Exception ex)  
        {  
            // 处理异常,例如记录日志等  
            Console.WriteLine("An exception occurred: " + ex.Message);  
        }  
        finally  
        {  
            isProcessing = false; // 确保在操作完成后重置标志位,即使出现异常也是如此  
        }  
    }  
}

调用

public class Program  
{  
    static void Main(string[] args)  
    {  
        SafeTimer timer = new SafeTimer(1, () =>   
        {  
            // 这里放置你的操作代码,该代码会每秒执行一次,并且不会因为定时器的Elapsed事件而重入。  
            Console.WriteLine("定时任务执行了,当前时间:" + DateTime.Now);  
            throw new Exception("模拟异常"); // 模拟一个异常,用于测试try-catch块是否工作正常。实际应用中根据需要决定是否抛出异常。  
        });  
        timer.Start(); // 启动定时器  
        Console.WriteLine("按下Enter键停止程序...");  
        Console.ReadLine(); // 等待用户输入,以便查看定时器的输出和异常处理结果。实际应用中可按需移除或替换此行。  
        timer.Stop(); // 停止定时器(可选)  
    }  
}

你可能感兴趣的:(c#,服务器,数据库)