我正在将Classic 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 Scheduler中设置。
这是一种合理的方法吗?有更好的方法吗?我读过有关计时器和任务的内容,但我不确定它们是否适合我想要完成的任务。
答案 0 :(得分:2)
您可以在上一次使用Task.ContinueWith之后触发每项任务。有关详细信息,请参阅this related answer。
数据库查询返回受影响的行,这是您告诉数据库完成运行您执行的查询的方式,而不是仅将其传递给数据库。
使用这样的方法而不是简单地休眠线程所看到的优点是,您永远不会同时运行多个任务,并且任务之间不会出现停机。
这有多重要取决于你对自己有更深入了解的情况。
答案 1 :(得分:1)
由Windows Scheduler启动的控制台应用程序对我来说很好。我自己做了一个我每天运行一次的数据库集成程序。 对于定时事件,我使用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);
您可以创建多个计时器,并为它们分配不同的任务,并使用不同的开始时间来解决您的问题。
答案 2 :(得分:0)
另一个建议是运行它以获得它的价值。您可以查看Quartz.Net而不是在Windows下运行控制台应用程序,这样您就可以通过您的网站运行任务(或Quartz中的Jobs),并立即部署和更新所有代码,而不需要单独使用控制台应用。您可以使用CRON计时设置来安排它们 - 尽管该站点需要运行,因此如果在奇数时间运行,您可能需要监控或ping设置。
然后,您可以使用单独的计划设置任务,或者像上面其他人建议的那样,让一个任务包含在其他人完成时运行的步骤。