我是新来的...

我有一个问题,是否有人可以帮助我。

它与计时器(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/

10-12 00:11
查看更多