最近我写了几个定时上传数据的小程序,感觉自己不是程序员,而是代码搬运工。重复的事情做起来总是很令人烦恼,那有什么办法解决这种问题呢?定时执行的功能都是一样的,只是每个程序需要处理上传的数据是不一样的。通俗地说,我就是想写好定时运行的功能,未来还有定时执行程序的时候,我只要专注实现业务就好了。
这个问题可以使用反射和接口完美的解决。我们在winform界面添加Timer和BackgroundWorker组件,Timer控件用来实现定时,BackgroundWorker控件实现后台异步执行任务,这种组合能够完美地解决界面假死的问题。组件使用代码如下:
private void timer1_Tick(object sender, EventArgs e)
{
DateTime dtNow = DateTime.Now;
if ((this.frenquecyID == "D" && dtNow.Hour == uploadDateTime.Hour && dtNow.Minute == uploadDateTime.Minute && dtNow.Second == uploadDateTime.Second)
|| (this.frenquecyID == "H" && dtNow.Minute == uploadDateTime.Minute && dtNow.Second == uploadDateTime.Second)
|| (this.frenquecyID == "M" && dtNow.Second == uploadDateTime.Second)|| this.frenquecyID == "S")
{
if (isRunning) return;
isRunning = true;//执行中
this.backgroundWorker1.RunWorkerAsync();
}
}
timer控制定时任务执行方式,天、小时、分钟或者秒为频次执行业务。Timer的Tick事件中,我们判断频次,判断当前时间是否与预定的执行时间相同,假如符合频次和时间相同的条件,我们就异步执行BackgroundWorker的DoWork事件。
我们接下来,看一下BackgroundWorker的DoWork事件实现。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
operationInterfaceProxy.ProcessData();
}
看到了吗?其实很简单,就是执行业务代理的操作而已。
接下来,我们要看一下接口代理类(OperationInterfaceProxy)的实现,代码如下所示:
using System;
using System.Collections.Generic;
using S