首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Timers.Timer奇怪行为

System.Timers.Timer奇怪行为
EN

Stack Overflow用户
提问于 2015-05-29 22:51:04
回答 1查看 131关注 0票数 0

这是一个密码。快跑,立即按压P。你应该看第一次约会两次。我明白了。我真的不知道为什么会这样。我想理解它。有人能清楚地向我解释一下吗?

代码语言:javascript
复制
using System;
using System.Timers;
using System.Diagnostics;

namespace Timer1
{
    class Program
    {
        static Stopwatch stopwatch = new Stopwatch();

        static Timer timer;

        static int interval = 1000;

        static void Main(string[] args)
        {
            Console.SetBufferSize(1000, 1000);

            timer = new Timer(interval);
            timer.Elapsed += Function;
            timer.Interval = interval;
            timer.Enabled = true;

            stopwatch.Start();

            while (true)
            {
                ConsoleKey key = Console.ReadKey(true).Key;

                if (key == ConsoleKey.P)
                {
                    int temp = interval - (int)stopwatch.ElapsedMilliseconds;

                    if (temp > 0)
                        timer.Interval = temp;

                    else
                        Function(null, null);
                }

                else
                {
                    timer.Dispose();
                    break;
                }

                Console.ReadKey(true);
            }
        }

        static public void Function(object sender, EventArgs e)
        {
            timer.Interval = interval;
            Console.WriteLine(DateTime.Now);
            stopwatch.Reset();
            stopwatch.Start();
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-29 23:02:24

按照编写代码的方式,您有两个函数()路径。其中一条路径是,当计时器实际过期时,函数()就会被“处理”。另一条路是

代码语言:javascript
复制
interval - stopwatch.ElapsedMilliseconds

不大于0,在这种情况下直接调用函数()。

看起来您正在使用System.Timers.Timer。这是在线程池线程上运行的。因为有多个线程在运行,所以这两个线程都可以调用Function()。您可能认为通过在Function()中重置内部和秒表来防范这种情况,但是Console.WriteLine()足以允许一个线程推迟而让另一个线程运行(在多处理器计算机上,这两个线程可以同时在不同的处理器上运行)。

根据逻辑的本质,可以保证计时器间隔几乎在间隔测试达到0的同时触发(调用处理程序),因此您可以期望它在这两条路径上运行。

这个例子看上去不太有用。仅仅是为了理解计时器吗?如果你愿意的话,你可以改变时间间隔,但是当你把时间更改为大致的时间间隔(或者应该改变的时间间隔)时,你为什么要费心呢?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30540234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档