当前位置:  开发笔记 > 编程语言 > 正文

System.Threading.Timer不会触发

如何解决《System.Threading.Timer不会触发》经验,为你挑选了1个好方法。

我是新来的...

我有一个问题,如果有人可以帮助我.

它是关于计时器(System.Threading.Timer).

我想打破不可避免的递归:我在datarow中有两列,它们是相互依赖的(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毫秒标志应该回到真,一切都恢复正常.

现在,当我按照DEBUGGER中的代码进行操作时,一切正常,但是当我启动应用程序NORMALLY重置功能根本不会触发,标志永远停留在虚假状态,并且一切都是假的.我玩弄due_time参数但似乎没有任何帮助.

有任何想法吗?



1> Jim Mischel..:

虽然我同意那些说你应该找到另一种方法来阻止无限递归的人,但你的计时器不会触发的原因可能是因为它被优化了.我最近遇到了其他事情.

假设您想要一个定期计时器:

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
}

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有