利用接口完成后台定时执行任务

开发工具与关键技术:工具:Visual Studio 2015,技术:后端、C#
作者:范子超  撰写时间:2019-03-28

在某些应用中,我们不难见到定时执行任务的功能。就比如我们常用的支付宝,里面有一个芝麻信用功能,支付宝会根据你的信用情况定时每个月对你的芝麻分进行评估;又比如某个系统会定时清理垃圾数据。除了上面所说两种外还有多种用法,而下面我要说的就是本人完成项目的过程中所用的一种用法。
首先说一下我要做的事:遍历会员表判断会员的有效期是否超过当前日期,针对超过的会员修改其会员状态。
然后说说我的思路:利用定时任务(不是setInterval和setTimeout)在后台不断的执行判断有效期的操作。
接下来进行具体操作:先把接口文件拷贝到项目文档中的bin文件夹内,然后再到项目内引用接口文件。
如图:

在这里插入图片描述
接下来看代码:先创建一个类给它继承接口对象,这个接口只有一个成员,而我们就只需要在它的成员内定义自己想做的事就可以了。注意类的创建要与控制器同级。

class MyJob : IJob //执行计时任务的接口   接口:它只包含了成员(方法)的声明。接口提供了派生类应遵循的标准结构。
    {
        public void Execute()   //这里是接口成员(方法)的定义
        {
            MainController MyMain = new MainController();   //实例化控制器对象
            MyMain.AutoAdd();   //通过控制器对象调用具体的方法来完成操作
        }
    }

然后在创建一个类给它继承注册计时任务的类,在类里面创建一个和类名相同的构造函数,函数体定义多久完成一次接口调用。注意类的创建要与控制器同级。
注意:从启动项目到网页打开会消耗掉计时任务的1-2秒钟时间。

class MyRegistry : Registry//注册计时任务的类
    {
        public MyRegistry()//构造函数和类名相同,没有任何返回类型,只在创建类的新对象时执行
        {
            Schedule<MyJob>().ToRunNow().AndEvery(5).Seconds();//每5秒执行一次
        }
    }

最后一步至关重要,在完成了以上操作后还需要在项目的应用程序文件中加上一句代码。作用就是在项目启动时就初始化计时任务的类,初始化完成后就开始按照设置的时间规则执行设置好的操作。
如图:
在这里插入图片描述

鉴于上面执行的操作不好看出效果,下面我会给出一个结合视图输出的简单写法以便大家理解。
首先声明一个静态的INT型字段,然后写一个方法返回字段值,再然后写一个返回类型为空的方法用来处
理字段值(字段值自增)。

public static int Par { get; set; }   //声明静态int型的字段方便调用
public ActionResult myfun()   //myfun方法返回字段值
{
	return Json(Par, JsonRequestBehavior.AllowGet);
}

public void AutoAdd()   //声明一个返回值为空的方法用来处理字段值(想做的操作)
 {
	 Par++;
}

然后就是计时任务的设置以及接口的调用了。这里设置的是每三秒执行一次(也就是每3秒字段自增一次),不要忘了还要去应用程序文件里加上那一句代码。
这里还列举了多种设置时间间隔的方法,当然还不只这些设置,我就不多列举了。
注意:从启动项目到网页打开会消耗掉计时任务的1-2秒钟时间。

class MyJob : IJob//执行计时任务的接口  接口:它只包含了成员(方法)的声明。接口提供了派生类应遵循的标准结构。
{
	public void Execute()//这里是接口成员(方法)的定义
	{
		MianController myMianController = new MianController();
		myMianController.AutoAdd();
	}
}
class MyRegistry : Registry//注册计时任务的类
{
	public MyRegistry()//构造函数和类名相同,没有任何返回类型,只在创建类的新对象时执行
	{
		Schedule<MyJob>().ToRunNow().AndEvery(3).Seconds();//每3秒执行一次
		//Schedule<MyJob>().ToRunNow().AndEvery(1000).Milliseconds();//每1000毫秒执行一次
		//Schedule<MyJob>().ToRunNow().AndEvery(1).Minutes(); //每1分钟执行一次
		//Schedule<MyJob>().ToRunNow().AndEvery(1).Hours().At(1);//每小时的01分执行一次,去掉At就是每小时准点执行一次
		//Schedule<MyJob>().ToRunNow().AndEvery(1).Days().At(17, 24);//每天的17时24分执行一次,去掉At就是每天的0点执行一次

		//Schedule<MyJob>().ToRunNow().DelayFor(10).Seconds();//延迟至10秒后执行一次
		//Schedule<MyJob>().ToRunOnceIn(10).Seconds();//延迟至10秒后执行一次
		//Schedule<MyJob>().ToRunNow().DelayFor(10000).Milliseconds();//延迟至10000毫秒后执行一次
		//Schedule<MyJob>().ToRunNow().DelayFor(1).Minutes(); //延迟至1分钟后执行一次
	}
}

最后是视图的代码了:页面加载时用setInterval每一秒执行一次post提交控制器的myfun方法返回控制器定义的那个字段的值。以便查看字段值的变化。
如图:

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>定时任务</title>
</head>
<body>
    <div style="font-size:30px;" id="timeee">
        
    </div>
    <script src="~/jquery-1.12.4.min.js"></script>
    <script src="~/bootstrap.min.js"></script>
    <script>
        var time;
        $(function () {
            time = setInterval(function () {
                $.post("Mian/myIndex", function (data) {
                    $("#timeee").append("<span>这是第" + data + "次调用</span></br>")
                });
            }, 1000);
        });
    </script>
</body>
</html>

下面是效果图:

在这里插入图片描述
因为启动项目消耗了2秒,所以1只出现了一次。

总结:这个方法与setInterval类似,它们区别是setInterval受到页面限制,假设你在一个页面设置了setInterval,那么只有当这个页面处于打开状态时setInterval才会起作用,退出就失效了。而上面那种方法则不受这种限制,只要保证项目处于启动状态,它就会给你执行你设置好的操作。

好了,到这就完了,如果有哪里不对的请各位提出,也好让我吸取更多的知识。

猜你喜欢

转载自blog.csdn.net/qq_41708308/article/details/88926443
今日推荐