我是新来的...
我有一个问题,是否有人可以帮助我。
它与计时器(System.Threading.Timer)有关。
我想打破不可避免的递归:我在数据行中有两列,它们是相互依赖的(price_without_VAT和price_with_VAT)。设置其中之一肯定会导致StackOverflowException。所以这是想法:
bool flag = true;
void Reset(object state) { flag = true; }
现在,包装改变列之一的值的方法:
{
if(flag)
{
flag = false;
System.Threading.Timer tmr = new System.Threading.Timer(new System.Threading.TimerCallback(Reset), null, 10, System.Threading.Timeout.Infinite);
datarow.other_column = value;
}
}
datarow.other_column.value行将立即触发上述方法,但由于flag为false,因此不会进行递归。
在10毫秒内,标志应恢复为true,一切恢复正常。
现在,当我遵循DEBUGGER中的代码时,一切正常,但是当我启动应用程序NORMALLY Reset函数时,根本不会触发,标志永远固定为false,并且一切都为假。我玩着Due_time参数,但似乎无济于事。
有任何想法吗?
最佳答案
尽管我同意那些说您应该找到另一种方法来防止无限递归的观点,但您的计时器不触发的原因可能是因为它已被优化。我最近在做其他事情时遇到了这个问题。
假设您想要一个定期计时器:
void SomeMethod()
{
Timer MyTimer = new Timer(MyTimerProc, null, 3000, 3000);
// other stuff goes here
}
现在,您可以在调试模式下运行它,并且一切正常。但是,当您在发布模式下运行它时,计时器永远不会触发。这是因为它已被优化。您需要做的是保持活动状态(使用GC.KeepAlive)或
using
:using (Timer MyTimer = new Timer(MyTimerProc, null, 3000, 3000))
{
// other stuff here
}
关于c# - System.Threading.Timer不会触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2449625/