【发布时间】:2012-11-27 23:01:22
【问题描述】:
我目前正在使用 C# 开发一个项目。我正在使用单个锁同步对状态变量的访问。触发此状态变量以设置给定时间段,然后应重置其值。我目前的代码如下。
using System.Threading;
class Test
{
object syncObj = new object();
bool state = false;
Timer stateTimer;
Test()
{
stateTimer = new Timer(ResetState, this, Timeout.Infinite, Timeout.Infinite);
}
void SetState()
{
lock(syncObj)
{
state = true;
stateTimer.Change(1000, Timeout.Infinite);
}
}
static void ResetState(object o)
{
Test t = o as Test;
lock(t.syncObj)
{
t.state = false;
}
}
}
鉴于在 Timer 调用 ResetState 之前再次调用 SetState 是有效的(即允许延长状态为 true 的时间段),我可以想象单个锁可能不够用的情况。我想到的具体情况是这样的
- SetState 和 ResetState 是同时进入的,分别在主线程和 Timer 线程上
- SetState 先获取锁,正确设置 state 为 true 并触发定时器重新启动
- ResetState 然后错误地将 state 设置为 false,这意味着在预期的时间段内 state 不是 true
我一直在为这个问题摸不着头脑。我最接近能够解决的方法是使用两个锁,但最后我发现这导致了其他问题(至少,我这样做的方式)。
是否有解决此问题的已知方法(我是否应该阅读一些东西来更新我的同步知识)?
更新:我忘了提到在这种情况下无法查询计时器的当前状态。如果可以的话,我会想象检查 ResetState 中的剩余时间以确定计时器是否真的停止了。
【问题讨论】:
标签: c# timer synchronization