C#定时执行一个操作
一个客户端向服务器端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();
}
private void Do(CancellationTokenSource ct)
{
for (int i = 0; i < 3; i++)
{
if (!ct.IsCancellationRequested)
{
int restSeconds = GetMsgRestSeconds();
if (restSeconds > 0)
{
SetTextBoxText("请等待,暂停 " + restSeconds + " 秒\r\n");
Thread.Sleep(restSeconds * 1000);
}
SetTextBoxText("正在发送第" + (i + 1).ToString() + "个客户...\r\n");
AppSettings.SetValue("LastMsgTime", DateTime.Now.ToString());
}
else
{
SetTextBoxText("任务" + (i + 1).ToString() + "取消\r\n");
}
}
}
/// <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个客户...
任务结束
C#定时执行一个操作的更多相关文章
- 使用oracle 的 PL/Sql 定时执行一个存储过程
CSDN日报20170322--<关于软件研发的一些体会总结> 同步博客至 CSDN ,让更多开发者看到你的文章 看微博技术大咖解析互联网应用架构实战 使用oracle 的 PL/Sql ...
- c# 定时启动一个操作、任务
// 定时启动一个操作.任务 using System; using System.Collections.Generic; using System.Collections.ObjectModel; ...
- (原创)在service中定时执行网络操作的几点说明
执行网络操作是耗时操作,即便是在service中也要放到子线程中执行 这里我用到了async-http-client框架来执行异步请求操作 计时用的java原生Timer和TimerTask类 本来这 ...
- Quartz.NET实现作业调度(3.0版本实现)定时执行一个任务
2.0版本请参考https://www.cnblogs.com/best/p/7658573.html这里的文章很详细: 我们现在想每5秒钟往txt文件夹里存储一个时间 首先:定义一个类,实现Quar ...
- 在Windows里定时执行一个Python文件
一.系统环境 操作系统:Win7 64位 二.说明 1.建立一个dos批处理文件 例: @echo off C: cd C:\work\python python aaa.py exit 2.利用Wi ...
- 最简单的???ubuntu 通过crontab定时执行一个程序
crontab在liunx系统中下载,我默认是认为下载安装了的.. crontab貌似只能在liunx系统中存在,如果是windows系统我不知道 创建一个名为jiaoben的文件夹存储sh文件,进入 ...
- oracle定时执行一个存储过程
首先需要新建存储过程 一 存储过程: create or replace procedure Insertdata is begin INSERT INTO tab_dayta select * fr ...
- android 定时执行一个任务
1. timer = new Timer(true) TimerTask task = new TimerTask(){ public void run(){ test(); } } timer.s ...
- java中定时执行任务
现在项目中用到需要定时去检查文件是否更新的功能.timer正好用于此处. 用法很简单,new一个timer,然后写一个timertask的子类即可. 代码如下: package comz.autoup ...
随机推荐
- ExtJS4笔记 Data
The data package is what loads and saves all of the data in your application and consists of 41 clas ...
- AFN 2.6 code报错总结
1. 错误打印 code=-1016 filed: text/html 错误原因:AFN默认不能解析请求回来的text/html数据 解决办法: AFN3.0的请看这里 AFHTTPSessionM ...
- Node.js 使用 soap 模块请求 WebService 服务接口
项目开发中需要请求webservice服务,前端主要使用node.js 作为运行环境,因此可以使用soap进行请求. 使用SOAP请求webservice服务的流程如下: 1.进入项目目录,安装 so ...
- 《Linux内核分析》第二周 操作系统是如何工作的?
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK TWO(2 ...
- 当html标签不被识别时(不解析)不妨试试htmlspecialchars_decode();试试
- oracle: tochar(sysdate,'D')函数
学习oracle时碰到tochar(sysdate,'D')函数,但是发现并不是星期几,如今天是20150317,周二,但是得到的值为3 开始以为是系统日期什么的原因,试了试 select to_ch ...
- C语言 ---- 数组 iOS学习-----细碎知识点总结
#pragma mark - 数组:用来存放同一数据类型的数据 // 数组的定义:类型说明符 数组名[常量表达式] = {值1, 值2, 值3...}; // 定义一个float类型的数组,用来 ...
- Django,数据模型创建之数据库API参考(转载)
一旦 数据模型 创建完毕, 自然会有存取数据的需要.本文档介绍了由 models 衍生而来的数据库抽象API,及如何创建,得到及更新对象. 贯穿本参考, 我们都会引用下面的民意测验(Poll)应用程序 ...
- RDIFramework.NET ━ 9.9 角色权限管理 ━ Web部分
RDIFramework.NET ━ .NET快速信息化系统开发框架 9.9 角色权限管理 -Web部分 角色权限管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移 ...
- 使用ocr的自动备份还原ocr
1.查看ocr自动备份ocrconfig -showbackup 2.停止所有节点的集群件 3.还原ocr文件ocrconfig -restore <file-name> 4.重启crs, ...