C#定时执行一个操作

来源:互联网 发布:女生多大结婚合适 知乎 编辑:程序博客网 时间:2024/05/17 22:46
一个客户端向服务器端socket发送报文,但是服务器端限制了发送频率,假如10秒内只能发送1次,这时客户端也要相应的做限制,初步的想法是在配置文件中保存上次最后发送的时间,当前发送时和这个上次最后时间做比较,根据情况马上发送还是休眠相应的时间。
举个例子,服务器发送频率限制是10秒,上次最后发送时间是10:00:00,有两种情况:
(1)当前时间是10:00:03,则过7秒后发送;
(2)当前时间是10:02:00,则马上发送。

App.config
<!--发送频率限制(秒)--><add key="MsgTimeLimit" value="10"/><!--上次最后发送时间--><add key="LastMsgTime" value="2013-11-1"/>
Test.cs
CancellationTokenSource ct;private void btnOK_Click(object sender, EventArgs e){     btnOK.Enabled = false;     Task t = new Task(() => Do(ct));     ct = new CancellationTokenSource();     t.Start();     t.ContinueWith((x) =>     {         this.SafeCall(() =>         {             richTextBox1.AppendText("任务结束\r\n");             btnOK.Enabled = true;         });     }); }private void btnCancel_Click(object sender, EventArgs e){    ct.Cancel();}/// <summary>/// 获取发送剩余的时间/// </summary>/// <returns></returns>private int GetMsgRestSeconds(){    int msgTimeLimit = 0;    //获取要限制的间隔时间(秒)    int.TryParse(AppSettings.GetValue("MsgTimeLimit"), out msgTimeLimit);    if (msgTimeLimit == 0)        return 0;    //最近一次时间    string lastMsgTime = AppSettings.GetValue("LastMsgTime");    DateTime dtLastMsgTime = DateTime.MinValue;    DateTime.TryParse(lastMsgTime, out dtLastMsgTime);    DateTime dtNow = DateTime.Now;          if (dtLastMsgTime == DateTime.MinValue || dtLastMsgTime >= dtNow)        return 0;                     TimeSpan ts = dtNow - dtLastMsgTime;    int restSeconds = 0;    if (msgTimeLimit > ts.TotalSeconds)    {        restSeconds = msgTimeLimit - (int)ts.TotalSeconds;        restSeconds = restSeconds < 0 ? 0 : restSeconds;    }    return restSeconds;}

其中
AppSettings.SetValue()和AppSettings.GetValue()方法见:
http://blog.csdn.net/gdjlc/article/details/8284799

SafeCall是个扩展方法
public static void SafeCall(this Control ctrl, Action callback)
{
    if (ctrl.InvokeRequired)
        ctrl.Invoke(callback);
    else
        callback();
}


点击【确认】按钮执行结果如下:

正在发送第1个客户...
请等待,暂停 10 秒
正在发送第2个客户...
请等待,暂停 10 秒
正在发送第3个客户...
任务结束

过了3秒钟,点击【确认】按钮并在执行完第一个操作按【取消】执行结果如下:

请等待,暂停 7 秒
正在发送第1个客户...
请等待,暂停 10 秒
正在发送第2个客户...
任务3取消
任务结束

过了5秒钟,点击【确认】按钮执行结果如下:

请等待,暂停 5 秒
正在发送第1个客户...
请等待,暂停 10 秒
正在发送第2个客户...
请等待,暂停 10 秒
正在发送第3个客户...
任务结束

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 车被扎了个洞怎么办 企业欠税交不起怎么办 组织代码查不到怎么办 u盾电量不足怎么办 对公账户拍照怎么办 个人怎么办对公账户 车辆超过年检日期怎么办 手机cpu负载过高怎么办 移动数据上网慢怎么办 服务器密码忘记了怎么办 网吧电脑卡死了怎么办 局域网连接不上怎么办 电脑没有dns地址怎么办 无法连接版本服务器怎么办 登录游戏就死机怎么办 亿企薪税保没有绑定企业怎么办 众筹如果不成功怎么办 淘宝被投诉商标权怎么办 茅台贴标褶皱怎么办 ins取不了名字怎么办 ins密码忘了怎么办 ins不记得密码怎么办 ins账号被停用怎么办 电脑登录不上怎么办 电脑桌面密码忘记了怎么办 苹果电脑用户名忘记了怎么办 w7电脑忘记密码怎么办 电脑win10忘密码怎么办 win7账号被停用怎么办 淘宝号忘了怎么办 xp忘记系统密码怎么办 u盘忘记密码怎么办 mac系统密码忘记怎么办 电脑用户名密码忘记怎么办 win7用户名密码忘记怎么办 用户名密码忘记了怎么办 电脑用户名忘记了怎么办 win10系统忘记用户名怎么办 邮件不显示主旨怎么办 电脑被停用了怎么办 电脑密码被锁怎么办