C#计划任务系列
我正在将经典ASP / VBScript应用程序转换为C#/ ASP.Net。 应用程序的VBScript部分是每个月在特定日期执行的一系列单独脚本,其中每个单独任务都在Windows Scheduler中设置。 大约35个任务包括数据库插入(保存每月历史数据,保存汇总账单数据)以及将一系列Crystal Reports导出为PDF和Excel。 每个任务安排大约一分钟,因为我不想在同时发生的请求中压倒数据库服务器。
正如我在C#中所做的那样,我想知道在一个应用程序中是否有办法实现这一点,而不是使用VBScript采用的单独脚本方法。 我对C#感到满意,因为我一直使用它在过去一年左右将应用程序的网站部分转换为ASP.Net MVC,但我没有使用C#中的定时事件的经验。 我正在考虑通过为每个任务分别创建一个函数来解决这个问题,在每个任务之间进行睡眠,以便在进行下一个任务之前有足够的时间进行数据库处理。 如下所示:
p.DoTask1();
Thread.Sleep(60000);
p.DoTask2();
Thread.Sleep(60000);
p.DoTask3();
Thread.Sleep(60000);
etc ...
这将被包装在一个控制台应用程序中,该应用程序本身将在Windows调度程序中设置。
这是一个合理的方法吗? 有更好的方法吗? 我已阅读了关于定时器和任务的内容,但我不确定它们是否适合我正在尝试完成的任务。
之前完成使用Task.ContinueWith后,您可以触发每个任务。 有关更多详细信息,请参阅相关答案
数据库查询返回的是受影响的行,这是您告诉数据库完成运行您执行的查询的方式,而不仅仅是将它传递给数据库。
我在使用像这样的方法来简单地睡眠线程时看到的优点是,您不会同时运行多个任务,并且任务之间不会停机。
这是多么重要取决于你有更深入洞察的情况。
Windows调度程序启动的控制台应用程序对我来说很好。 我自己就是为了我每天运行一次的数据库集成程序。 对于定时事件,我使用System.Threading.Timer类,如下所示:
//here you set a time to start
var timeToStart = 60000;
//here an interval, if it's not recurring use Timeout.Infinite
var tRefresh = Timeout.Infinite;
//here the method, I make it static
TimerCallback tcb1 = ClassName.MethodName;
var timer = new System.Threading.Timer(tcb1, null, timeToStart, tRefresh);
您可以创建多个定时器,并为其分配不同的任务,并使用不同的开始时间来解决您的问题。
另一个建议是为了运行它的价值。 你可以看看Quartz.Net,而不是在Windows下运行一个控制台应用程序,这样你就可以通过你的网站运行这些任务(或Quartz中的作业),并且一次部署和更新所有代码,而不需要单独的控制台应用程序。 您可以使用CRON计时设置来安排它们 - 尽管网站需要运行,所以如果在奇数时间运行,您可能需要监控或设置ping。
然后,您可以使用单独的时间表来设置您的任务,或者像其他人上面所建议的那样,您可以完成一项任务,并在其他人完成时执行一些任务。
链接地址: http://www.djcxy.com/p/38891.html