Quartz.net 3.4 - запуск работы в global.asax не запускается - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь запустить простую работу с quartz.net с последней версией (3.4), но она не запускается.

Global.asax

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;

using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Quartz.Api.ScheduledTasks;

namespace Quartz.Api
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            Task.Run(async () => { await JobScheduler.Start(); });
        }
    }
}

Планировщик заданий

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Quartz.Impl;

namespace Quartz.Api.ScheduledTasks
{
    public class JobScheduler
    {
        public static async Task Start()
        {
            IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();
            await scheduler.Start();

            IJobDetail job = JobBuilder.Create<TestJob>().Build();

            ITrigger trigger = TriggerBuilder.Create()
                .WithDailyTimeIntervalSchedule
                (s =>
                    s.WithIntervalInSeconds(10)
                        .OnEveryDay()
                        .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0, 0))
                )
                .Build();

            await scheduler.ScheduleJob(job, trigger);
        }
    }
}

Тестовое задание

using System.Threading.Tasks;

namespace Quartz.Api.ScheduledTasks
{
    public class TestJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            await Task.Run(() =>
             {
                 string[] lines = { "First line", "Second line", "Third line" };
                 System.IO.File.WriteAllLines(@"C:\Users\GOWDY_N\source\repos\Quartz\Quartz.Api\ScheduledTasks.txt",
                     lines);
             });

        }
    }
}

Текстовый файл в моем коде работы никогда не записывается на диск.

Я подозреваю, что я не правильно использую задачи, потому что Application_Start () в моем global.asax - это метод void, но я использую шаблон async / await в стеке вызовов.

Кто-нибудь знает хороший способ настроить мою работу в global.asax в кварце 3.0 или выше?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Если у вас нет веских оснований для использования Task.Run и вы просто хотите вернуть задачу, используйте вместо этого код:

using System.Threading.Tasks;

namespace Quartz.Api.ScheduledTasks
{
    public class TestJob : IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            string[] lines = { "First line", "Second line", "Third line" };
            System.IO.File.WriteAllLines(
                @"C:\Users\GOWDY_N\source\repos\Quartz\Quartz.Api\ScheduledTasks.txt",
                lines);
            return Task.CompletedTask;
        }
    }
}
0 голосов
/ 25 апреля 2018
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ...
        ScheduledTasks.JobScheduler.Start();
        ...
    }
}

Вместо записи в Global.asax напишите в Startup.cs Файл.

...