延时执行函数:前浪死在沙滩上
业务场景:有主表、子表两个gridview点击主表的行,会自动读取主表对应的子表数据
但是如果反复点击会导致反复读取,其实反复点击的时候只需要最后一次执行查询,前面的几次点击都是无意义操作
根据这一需求设计了一个函数:
private static list<system.windows.forms.timer> tup = new list<system.windows.forms.timer>();
/// <summary>
/// 延时执行
/// </summary>
/// <param name="easysub">需要执行的代码/函数</param>
/// <param name="keyname">任务分组</param>
/// <param name="timeout">等待timeout时间后执行代码,如果当前分组中进入新的任务则前面的任务放弃,执行新的任务</param>
/// <param name="chkstatus">等待一定时间且循环验证chkstatus</param>
public static void delayrun(action easysub, string keyname, int timeout = 501)
{
system.windows.forms.timer lasttimer = tup.find(t => t.tag.tostringex() == keyname);
if (lasttimer != null)
{
lasttimer.enabled = false;
lasttimer.enabled = true;
}
if (lasttimer == null)
{
system.windows.forms.timer t = new system.windows.forms.timer();
t.interval = timeout;
t.enabled = true;
t.tag = keyname;
tup.add(t);
t.tick += delegate (object sender, eventargs e)
{
((system.windows.forms.timer)sender).enabled = false;
string name = keyname;
easysub();
};
}
}