欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

延时执行函数:前浪死在沙滩上

程序员文章站 2022-06-05 20:58:13
业务场景:有主表、子表两个GridView点击主表的行,会自动读取主表对应的子表数据但是如果反复点击会导致反复读取,其实反复点击的时候只需要最后一次执行查询,前面的几次点击都是无意义操作根据这一需求设计了一个函数:private static List Tup = new List();/// //... ......

业务场景:有主表、子表两个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();
         };
     }
}