我正在尝试创建一个方法,该方法将返回一个可以每毫秒调用一次的委托,但是我想限制它运行慢速操作,而不是每次调用它时,但是在5秒钟内说最少一次。
尝试使用Timer和Stopwatch实现这一目标,但无法坚持使用经济实惠的解决方案。
第一种方法:
public Func<bool> GetCancelRequestedFunc(string _taskName)
{
var checkStatus = false;
var timer = new Timer(5000);
timer.Elapsed += (sender, args) => { checkStatus = true; };
return () =>
{
if (checkStatus)
{
bool result;
checkStatus = false;
//long operation here
return result;
}
return false;
};
}
第一种方法对我来说似乎更好但是它不起作用 - 这里的长期操作从未被调用过,我无法找出原因。可能需要将checkStatus
作为ref
传递,但在这种情况下不确定如何制作
第二种方法:
public Func<bool> GetCancelRequestedFunc(string _taskName)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
return () =>
{
var mod = stopwatch.ElapsedMilliseconds % 5000;
if (mod > 0 && mod < 1000)
{
bool result;
//long operation here
return result;
}
return false;
};
}
这个有用...但非常不可靠,因为如果调用委托,似乎在第6秒执行检查。但是它会在第6秒内一直被调用。
你能说出第一种方法有什么问题,或者建议更好吗?
答案 0 :(得分:1)
这里你真的不需要任何计时器,只记得上次执行你的功能的时间:
public Func<bool> GetCancelRequestedFunc(string taskName)
{
DateTime lastExecution = DateTime.Now;
return () =>
{
if(lastExecution.AddMinutes(5)<DateTime.Now)
{
lastExecution = DateTime.Now;
bool result;
//long operation here
return result;
}
return false;
};
}