Qt具有使用Lambda执行定时操作的简洁功能。
仅需一行代码即可在延迟后执行操作:
QTimer::singleShot(10, [=](){
// do some stuff
});
虽然我还没有在C#中找到相应的等效物。
我找到的最接近的是
Timer timer = new Timer();
timer.Interval = 10;
timer.Elapsed += (tsender, args) => {
// do some stuff
timer.Stop();
};
timer.Start();
但它的外观并不够干净。
有没有更好的方法来实现这个?
使用场景是通过串行线发送数据到一些硬件,在点击按钮或执行操作时,通常需要发送命令,然后在几毫秒后发送一个数据包。
使用帮助函数的解决方案:
public void DelayTask(int timeMs, Action lambda)
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = timeMs;
timer.Elapsed += (tsender, args) => { lambda.Invoke(); };
timer.AutoReset = false;
timer.Start();
}
调用方
DelayTask(10, () => /* doSomeStuff...*/ );
QTimer::singleShot
在内部看起来更干净。 - tkausltimer.AutoReset
为 false(默认值为 false),则无需停止计时器。 - Maximilian AstSystem.Timers.Timer
,并在构造函数中将其配置为仅触发一次,例如:new Timer(_=>lambda(),null,timeMS,Timeout.Infinite);
- Panagiotis Kanavos