¿Por qué quartz.net no ejecuta todo mi código?

Estoy usando una tarea programada usando quartz.net en mvc, pero lamentablemente no todo mi código funciona completamente e ignora la mayoría de los pasos del código. Después de mucho esfuerzo y comparación con ejemplos anteriores, me di cuenta de que la función de ejecución heredada de la clase IJOB es un tipo asinc, y después de llamar a global. asax, tengo que definirlo de la siguiente manera, en cuyo caso no ejecuta el código por completo e ignora parte de él. Gracias por la ayuda porque realmente me molestó Global.asax:

public class Global : HttpApplication
{
    
    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        ConfigureStoryQuartzJobs().Wait();

    }



    public static  async Task ConfigureStoryQuartzJobs()
    {
        DateTimeOffset startTime = DateTime.UtcNow;

        IJobDetail job = JobBuilder.Create()
                                  .WithIdentity("job1")
                                  .Build();
        ITrigger trigger = TriggerBuilder.Create()
                                         .StartAt(startTime)
                                         .WithSimpleSchedule(x => x.WithIntervalInMinutes(5).RepeatForever())
                                         .Build();
        ISchedulerFactory sf = new StdSchedulerFactory();
        IScheduler sc = await sf.GetScheduler();
      await  sc.ScheduleJob(job, trigger);
       await sc.Start();

    }
}

trabajo:

 public class CheckContent : IJob
{

    public async Task Execute(IJobExecutionContext context)
    {
      await  RelaseContent.SendStory();
      await  RelaseContent.SendPost();
      await  RelaseContent.SendAlboum();
    }
}

Pregunta hecha hace 3 años, 4 meses, 28 días - Por codecanvas


2 Respuestas:

  • El problema que estás experimentando con Quartz.NET y tu código podría estar relacionado con el uso de métodos asincrónicos en la ejecución de tus tareas programadas. La biblioteca Quartz.NET no maneja de manera nativa tareas asincrónicas, por lo que es posible que esté causando que tu código se ejecute de manera incompleta.

    Una solución a este problema sería encapsular la lógica asincrónica dentro de un método síncrono y llamar a este método desde la tarea programada. Puedes utilizar la clase Task.Run() para ejecutar métodos asincrónicos en un hilo diferente de manera síncrona.

    A continuación te muestro un ejemplo de cómo modificar tu código para que funcione correctamente con Quartz.NET:

    Global.asax:

    csharp
    public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            // Code that runs on application startup
    
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
    
            ConfigureStoryQuartzJobs().Wait();
        }
    
        public static void ConfigureStoryQuartzJobs()
        {
            DateTimeOffset startTime = DateTime.UtcNow;
    
            IJobDetail job = JobBuilder.Create()
                .WithIdentity("job1")
                .Build();
            ITrigger trigger = TriggerBuilder.Create()
                .StartAt(startTime)
                .WithSimpleSchedule(x => x.WithIntervalInMinutes(5).RepeatForever())
                .Build();
    
            ISchedulerFactory sf = new StdSchedulerFactory();
            IScheduler sc = sf.GetScheduler().Result;
    
            sc.ScheduleJob(job, trigger).Wait();
            sc.Start().Wait();
        }
    }
    

    Trabajo:

    csharp
    public class CheckContent : IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            return Task.Run(() =>
            {
                RelaseContent.SendStory().Wait();
                RelaseContent.SendPost().Wait();
                RelaseContent.SendAlboum().Wait();
            });
        }
    }
    

    Al realizar estos cambios, tu código debería ejecutarse de manera correcta y completa utilizando Quartz.NET en tu aplicación MVC.

    Respondida el Dec 19, 2020 a las 09:54 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema es que el método Execute de tu clase CheckContent está marcado como async, pero el tipo de retorno del método es Task. Esto significa que el método devuelve una tarea, pero no espera a que se complete antes de continuar.

    Para solucionar este problema, cambia el tipo de retorno del método Execute a void y elimina la palabra clave async del método. Esto hará que el método ejecute el código de forma síncrona y espere a que se complete antes de continuar.

    csharp
    public class CheckContent : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            RelaseContent.SendStory().Wait();
            RelaseContent.SendPost().Wait();
            RelaseContent.SendAlboum().Wait();
        }
    }
    

    Además, asegúrate de que los métodos SendStory, SendPost y SendAlboum en la clase RelaseContent también sean async. Esto te permitirá utilizar await dentro de estos métodos para esperar a que se completen las operaciones asincrónicas.

    Respondida el Dec 19, 2020 a las 09:54 - por Gemini

    Votos positivos: 0 | Votos negativos: 0