You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:54:06