当前位置: 首页 > 知识库问答 >
问题:

如果一个计时器不能在新的循环时间到来之前完成所有工作怎么办?

督坚白
2023-03-14

假设我们有一个计时器,它每10分钟运行一次。如果它的处理周期超过10分钟怎么办?一个新线程会为此启动吗?它会中断它当前的操作吗?如果一个对象在计时器内发生突变怎么办?

抱歉,如果我没有提到任何代码,因为问题很清楚,而且我想从多线程编程极客的角度知道完整的答案,而不是通过示例应用程序来测试它来找到松散的答案。实际上,我想知道它工作机制背后的逻辑。

共有3个答案

穆飞星
2023-03-14

为了防止重入,您可以使用一个静态布尔值来告诉阉羊函数已经被执行了。用户尝试/Catch/最终并在最后将这个布尔值设置为false,以确保如果您在代码中犯了错误或代码失败,布尔值不会保持为false。
为了更快的计时器,应该使用信号量(互斥锁)来防止重入。

闾丘树
2023-03-14

把你的代码放在Monitor.TryEnter()

object timeCheck= new object();

void Timer()
{
    Monitor.TryEnter(timeCheck) 
    {
        //Code that might take too long 
        //...
        Monitor.Exit();
    }
}
陶成化
2023-03-14

如果您正在使用System.Threading.TimerSystem.Timers.Timer,计时器将再次滴答作响,启动一个新线程。请参阅https://stackoverflow.com/a/10442117/56778避免该问题的方法。

如果您使用的是<code>System.Windows.Forms。计时器</code>,则在前一个完成处理之前不会出现新的滴答声。

 类似资料:
  • 问题内容: 我创建了一个for循环,该循环循环了元素出现在容器中的次数。for循环从HTML捕获一些数据,并创建一个JSON url,然后将返回一个值。然后应将该值添加到适当位置的HTML中。 问题似乎是for循环在进行所有Ajax调用之前完成,因此仅将最后一个值添加到HTML。我以为可以确保readystate等于4,但是该解决方案不起作用。我还尝试将完整而不是成功用作Ajax事件。有什么见解吗

  • 我是新的完全未来。我试图为元素列表(即参数)调用并行方法,然后将结果组合起来创建最终响应。我还试图设置50毫秒的超时,以便如果调用不返回50毫秒,我将返回默认值。 到目前为止,我已经尝试过: 但我一直得到错误说: 有人能告诉我我在这里做错了什么吗?如果我走错了方向,请纠正我。 谢谢

  • 问题内容: 我有一个脚本,该脚本遍历包含要访问的URL:s并截取其屏幕截图的文本文件。 所有这一切都完成且简单。该脚本会初始化一个类,该类在运行时会创建列表中每个站点的屏幕快照。某些站点的加载时间非常非常长,而某些站点可能根本无法加载。因此,我想将函数包装在一个超时脚本中,以使该函数在10秒内无法完成时返回。 我对最简单的解决方案感到满意,也许设置一个异步计时器,无论函数内部实际发生什么,该计时器

  • 问题内容: 给定表: 名称对于所有人而言都是唯一的 哪种SQL查询可以生成所有可能的n!/(((n-2)!2!)循环组合? 假定Person的基数始终等于4 示例人物= {‘Anna’,’Jerome’,’Patrick’,’Michael’) 输出: 任何帮助,将不胜感激。谢谢! 这是我的答案(我使用了oracle SQL): 问题答案:

  • 我正在尝试在我的小树枝视图中使用for循环来获取一周中的所有日子。 以下是我想做的事情: 这就是我迄今为止所尝试的: 但我得到了这个错误信息: 在呈现模板期间引发了异常(“DateTime::_construct():无法分析位置0处的时间字符串(“0天”)(“):意外字符”) 你知道我该怎么做吗?

  • 问题内容: 如何在C语言中创建一个计时器? 我想要一段代码从gps解析器输出中连续获取数据。 是否为此提供了良好的库,还是应该自行编写? 问题答案: 最简单的方法: