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,所以它只是启动一个新线程-然后我的作业运行多次。

该怎么办?: -)

MVC应用中的作业调度

重新设计应用程序。你不应该将app-pool用于批处理活动。Windows为这类操作提供了服务和调度程序。

下面是为什么不应该在应用程序池中有后台任务的首要原因。应用程序池是循环的,它不是为托管批处理作业而创建的,循环意味着它会停止进程并重新启动。进程中运行的所有线程都将被终止。它对您的请求线程的突然死亡有一些保护,但对您所创建的任何类型的请求线程都没有保护。

建议如何解决它。

  • 使用服务应用程序
  • 使用计划任务
  • 使用Azure webjob,你可以调度

您看过为此设计的解决方案吗?为什么要重新发明轮子呢?

看看Hangfire.io

你可以这样做:

BackgroundJob.Enqueue(BatchClient.Start(););

或者您可以添加一个循环作业:

RecurringJob.AddOrUpdate(() => BatchClient.Start(), Cron.Daily);