我正在尝试在c#中实现一个定时器循环(比如一段代码应运行每30毫秒)。这并不是很难,因为SO中的其他问题已经解决了这个问题,例如this或this one。
最棘手的部分是这段代码可以持续超过循环时间。在这种情况下,我想等到它结束(不是另一个30毫秒等待)。
示例:
0 ms - 第一次迭代:代码在20 ms内完成。
30 ms - 第二次迭代:代码未及时完成。
60 ms - 等待第二次迭代代码结束。总共41毫秒。
71 ms - 第三次迭代:代码在15 ms内完成。
101 ms - 第四次迭代:代码在22 ms内完成。
等等。
我应该使用任务并检查是否已完成? 什么是公平,优雅的方式。 任何帮助都感激不尽。 感谢。
修改 经过几次尝试,这段代码似乎与示例代码一起使用,稍后我们将看到生产代码: https://dotnetfiddle.net/cqmTzF
答案 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;
}
}