MVC应用中的作业调度
本文关键字:作业调度 应用 MVC | 更新日期: 2023-09-27 18:01:53
我有一个MVC应用程序,并尝试启动一个线程来运行作业调度。我在Global中使用Application_Start。asax启动线程,Application_End再次停止线程。
但有时当网站有访问者时,我部署了一个新版本,Application_Start被触发不止一次。
在全球。我这样做:
BatchClient.Start();
下面是我的BatchClient代码:
public static class BatchClient
{
public static readonly List<BatchTask> BatchTaskList = new List<BatchTask>();
public static bool AllowToRun = true;
private static Thread handleThread = null;
public static void Start()
{
if (handleThread == null)
{
AddToInstanceLog("Start - in progress");
Setup();
handleThread = new Thread(Handler);
handleThread.Name = "NextBatchClient.Handler";
handleThread.Start();
ThreadUtil.AddThread(handleThread);
AddToInstanceLog("Start - done");
}
else
{
AddToInstanceLog("Allready running");
}
}
}
我的除非Application_Start不止一次被调用,否则handleThread每次都是null,所以它只是启动一个新线程-然后我的作业运行多次。
该怎么办?: -)
重新设计应用程序。你不应该将app-pool用于批处理活动。Windows为这类操作提供了服务和调度程序。
下面是为什么不应该在应用程序池中有后台任务的首要原因。应用程序池是循环的,它不是为托管批处理作业而创建的,循环意味着它会停止进程并重新启动。进程中运行的所有线程都将被终止。它对您的请求线程的突然死亡有一些保护,但对您所创建的任何类型的请求线程都没有保护。
建议如何解决它。
- 使用服务应用程序
- 使用计划任务
- 使用Azure webjob,你可以调度
您看过为此设计的解决方案吗?为什么要重新发明轮子呢?
看看Hangfire.io
你可以这样做:
BackgroundJob.Enqueue(BatchClient.Start(););
或者您可以添加一个循环作业:
RecurringJob.AddOrUpdate(() => BatchClient.Start(), Cron.Daily);