计时器循环在c#中,如果代码为';未完成
我试图在c#中实现一个计时器循环(假设每30毫秒应该运行一段代码)。这并不难,因为so中的其他问题已经解决了这个问题,比如,或者 最棘手的部分是,这段代码可以持续超过循环时间。在这种情况下,我想等到它结束(而不是再等待30毫秒) 例如: 0毫秒-第一次迭代:代码在20毫秒内完成 30毫秒-第二次迭代:代码没有及时完成 60毫秒-等待第二次迭代代码结束。总共41毫秒 71毫秒-第三次迭代:代码在15毫秒内完成 101毫秒-第四次迭代:代码在22毫秒内完成 等等 我是否应该使用任务并检查任务是否已完成? 这是一种公平、优雅的方式。 任何帮助都将不胜感激。 谢谢 编辑: 经过几次尝试后,此代码似乎与示例代码配合使用,让我们稍后查看生产代码:计时器循环在c#中,如果代码为';未完成,c#,loops,timer,C#,Loops,Timer,我试图在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;
}
}
你试过什么吗?如果有的话,你有例子吗?是的,我尝试了更多,显然得到了一个有效的解决方案。我编辑了这个问题。谢谢你的回答,它帮助我实现了我的代码。