Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计时器循环在c#中,如果代码为';未完成_C#_Loops_Timer - Fatal编程技术网

计时器循环在c#中,如果代码为';未完成

计时器循环在c#中,如果代码为';未完成,c#,loops,timer,C#,Loops,Timer,我试图在c#中实现一个计时器循环(假设每30毫秒应该运行一段代码)。这并不难,因为so中的其他问题已经解决了这个问题,比如,或者 最棘手的部分是,这段代码可以持续超过循环时间。在这种情况下,我想等到它结束(而不是再等待30毫秒) 例如: 0毫秒-第一次迭代:代码在20毫秒内完成 30毫秒-第二次迭代:代码没有及时完成 60毫秒-等待第二次迭代代码结束。总共41毫秒 71毫秒-第三次迭代:代码在15毫秒内完成 101毫秒-第四次迭代:代码在22毫秒内完成 等等 我是否应该使用任务并检查任务是否已完

我试图在c#中实现一个计时器循环(假设每30毫秒应该运行一段代码)。这并不难,因为so中的其他问题已经解决了这个问题,比如,或者

最棘手的部分是,这段代码可以持续超过循环时间。在这种情况下,我想等到它结束(而不是再等待30毫秒)

例如:

0毫秒-第一次迭代:代码在20毫秒内完成

30毫秒-第二次迭代:代码没有及时完成

60毫秒-等待第二次迭代代码结束。总共41毫秒

71毫秒-第三次迭代:代码在15毫秒内完成

101毫秒-第四次迭代:代码在22毫秒内完成

等等

我是否应该使用任务并检查任务是否已完成? 这是一种公平、优雅的方式。 任何帮助都将不胜感激。 谢谢

编辑: 经过几次尝试后,此代码似乎与示例代码配合使用,让我们稍后查看生产代码:

试试这样的方法:

    public class PeriodicAction
    {
        private int _frequencyMs;
        private readonly Timer _timer;
        private bool _enabled;

        public Action ActionMethod { get; private set; }

        public int FrequencyMs
        {
            get { return _frequencyMs; }
            set
            {
                _frequencyMs = value;
                _timer.Change(0, _frequencyMs);
            }
        }

        public bool Enabled
        {
            get { return _enabled; }
            set
            {
                _timer.Change(value ? 0 : Timeout.Infinite, _frequencyMs);
                _enabled = value;
            }
        }

        public bool IsRunning { get; private set; }

        public PeriodicAction(Action actionMethod, int frequencyMs)
        {
            this.ActionMethod = actionMethod;
            this._frequencyMs = frequencyMs;
            this._timer = new Timer(timerCallbackMethod, null, 0, frequencyMs);
        }

        private void timerCallbackMethod(object sender)
        {
            if (IsRunning) return;

            IsRunning = true;

            ActionMethod();
            _timer.Change(0, _frequencyMs);

            IsRunning = false;
        }
    }

你试过什么吗?如果有的话,你有例子吗?是的,我尝试了更多,显然得到了一个有效的解决方案。我编辑了这个问题。谢谢你的回答,它帮助我实现了我的代码。