如何在System.Timers.Timer的Elapsed事件中获取TaskTimer的taskID
实现方案
1. 修正自定义TaskTimer类的属性访问权限
你现有的taskID属性为私有访问级别,外部类无法读取,需要修改为public:
public class TaskTimer : System.Timers.Timer { // 修改访问修饰符为public,对外暴露可读取 public int taskID { get; set; } }
2. 在Elapsed事件中获取触发实例的taskID
Elapsed事件的sender参数就是触发当前事件的TaskTimer实例,做类型转换后即可读取属性值,同时可以加校验逻辑避免停止定时器后的误触发:
// 你的目标任务ID,注意类型和taskID一致为int private int currentTaskID = 1; private void OnTweakTimedEvent_autoTask(object sender, ElapsedEventArgs e) { // 校验sender类型,类型不匹配直接返回(兼容C# 7.0+版本写法) if (sender is not TaskTimer currentTimer) { return; } // 低版本C#兼容写法替换上面的校验: // TaskTimer currentTimer = sender as TaskTimer; // if (currentTimer == null) return; // 匹配taskID的同时判断定时器是否仍在启用状态,避免停止后的最后一次误触发 if (currentTimer.taskID == currentTaskID && currentTimer.Enabled) { // 你的业务逻辑 } }
可选优化:彻底避免停止后的误触发
如果需要更高的可靠性,可以在停止任务时主动移除事件绑定、销毁实例:
public List<TaskTimer> _taskTimers = new List<TaskTimer>(); // 停止指定ID的定时任务方法示例 public void StopTask(int targetTaskId) { var targetTimer = _taskTimers.FirstOrDefault(t => t.taskID == targetTaskId); if (targetTimer != null) { targetTimer.Stop(); // 移除事件绑定,避免实例销毁前触发事件 targetTimer.Elapsed -= OnTweakTimedEvent_autoTask; _taskTimers.Remove(targetTimer); targetTimer.Dispose(); } }
内容的提问来源于stack exchange,提问作者takatto
相关产品推荐
相关产品推荐

