计时器循环在c#中,等待代码未完成

时间:2016-03-29 03:04:16

标签: c# loops timer

我正在尝试在c#中实现一个定时器循环(比如一段代码应运行每30毫秒)。这并不是很难,因为SO中的其他问题已经解决了这个问题,例如thisthis one

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

示例:

0 ms - 第一次迭代:代码在20 ms内完成。

30 ms - 第二次迭代:代码未及时完成。

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

71 ms - 第三次迭代:代码在15 ms内完成。

101 ms - 第四次迭代:代码在22 ms内完成。

等等。

我应该使用任务并检查是否已完成? 什么是公平,优雅的方式。 任何帮助都感激不尽。 感谢。

修改 经过几次尝试,这段代码似乎与示例代码一起使用,稍后我们将看到生产代码: https://dotnetfiddle.net/cqmTzF

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

    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;
        }
    }