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
相关产品推荐
相关产品推荐

