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

C# Timers.Timer回调是否处于对象上下文,能否直接使用成员变量?

关于C# Timers.Timer回调的疑问解答

核心问题解答

  • 回调函数的上下文:TimerHandler作为类A的实例方法,当被Timer触发时,确实运行在当前A类对象的上下文里。因为创建Timer时传入的实例方法委托会隐式捕获当前对象的引用(即this指针),所以回调中可以直接访问对象的成员变量,无需像C++那样手动传递对象指针。
  • 直接使用成员变量的合法性:你代码里直接访问m_JustForShow是完全合法的,但要注意线程安全问题。Timers.Timer的回调在ThreadPool线程上执行,m_JustForShow可能被其他线程(比如调用MyEventNotification的线程)同时修改,若无同步机制,会出现竞态条件。

代码说明与注意事项

你的示例代码解读:

class A {
  Timer m_Timer;
  int m_JustForShow;

  public void TimerHandler(Object stateinfo) {
    // 转换合法,前提是传入的state确实为string类型
    string id=(string) stateinfo;
    // 直接访问m_JustForShow是允许的,但需注意线程安全
    if (m_JustForShow==1) {
      // 可在此执行逻辑,回调持有当前A对象的引用
    }
  }

  public void MyEventNotification(in MyEventInfo ei)
  {
    if (ei.State!=MyEventState.Completed) {
      // 每次创建新Timer会覆盖旧引用,未Dispose的旧Timer仍可能触发回调
      m_Timer=new Timer(TimerHandler, ei.StringID, 1000, Timeout.Infinite);
    }
  }
}

额外注意点:

  • 每次调用MyEventNotification都会创建新Timer并覆盖m_Timer,旧Timer若未手动Dispose,仍会在ThreadPool线程触发回调,可能导致多回调并行执行,甚至访问失效状态。建议创建新Timer前,对旧Timer调用Dispose()并置为null。
  • 对于m_JustForShow这类成员变量,建议使用线程安全的方式操作(比如Interlocked类方法、lock语句),避免竞态条件。

内容的提问来源于stack exchange,提问作者user3161924

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:56:00