Ошибка Quartz.NET возникает каждый раз, когда я его использую

Я получаю сообщение об ошибке в этой строке:

Невозможно неявно преобразовать тип «System.Threading.Tasks.Task» в «Quartz.IScheduler». Существует явное преобразование (вам не хватает приведения?)

Как решить; Я не понимаю? Пожалуйста помоги!

IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();

   public static void Start()
    {
        try
        {
            //Construct scheduler factory
            //IScheduler scheduler = schedulerFactory.GetScheduler();

           // IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();

            IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
            scheduler.Start();

            IJobDetail job = JobBuilder.Create<HelloJob>()
                .WithIdentity("jobName", "jobGroup")
                .Build();

            ITrigger trigger = TriggerBuilder.Create()
                .WithSimpleSchedule(s => s.WithIntervalInSeconds(60).RepeatForever())
                .StartNow()
                .Build();

            scheduler.ScheduleJob(job, trigger);

           // scheduler.Start();

        }

        catch (SchedulerException se)
        {
            //Console.WriteLine(se);
        }
    }
}

public class HelloJob : IJob
{
    private TBPESContext db = new TBPESContext();
    public void Execute(IJobExecutionContext context)
    {
        var AuthorName = from twitterAccount in db.Twitter_Account
                         from c in twitterAccount.Courses
                         select twitterAccount.Author_Name;

        foreach (var item in AuthorName)
        {
            TweetCrawler.SaveTweets(item);
        }


        throw new NotImplementedException();
    }
}

person user5231960    schedule 05.11.2016    source источник
comment
ты пробовал: ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler = schedulerFactory.GetScheduler();   -  person Rabban    schedule 07.11.2016
comment
Возможно ли, что у вас есть другой класс с именем StdSchedulerFactory, у которого есть метод GetDefaultScheduler, который возвращает задачу? Если да, попробуйте IScheduler scheduler = Quartz.Impl.StdSchedulerFactoryy.GetDefaultScheduler();   -  person sgmoore    schedule 09.11.2016


Ответы (5)


Начиная с версии 3.0.0 Quartz: https://www.quartz-scheduler.net/2017/12/30/quartznet-3.0-released.html :

  • SimpleThreadPool исчез, старые собственные потоки исчезли

  • Интерфейс IJob теперь возвращает задачу

Поэтому я помещаю здесь пример для использования:

class Program
{
    static void Main(string[] args)
    {
        JobScheduler jobScheduler = new JobScheduler();
        jobScheduler.Start();
        Console.ReadLine();
    }
}
public class JobScheduler
{
     public async void Start()
    {
        ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
        IScheduler scheduler = await schedulerFactory.GetScheduler();
        await scheduler.Start();

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

        ITrigger trigger = TriggerBuilder.Create()

            .WithIdentity("HelloJob ", "GreetingGroup")

            .WithCronSchedule("0 0/1 * 1/1 * ? *")

            .StartAt(DateTime.UtcNow)

            .WithPriority(1)

            .Build();

        await scheduler.ScheduleJob(job, trigger);

    }

}
public class HelloJob : IJob
{
    Task IJob.Execute(IJobExecutionContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }
        Task taskA = new Task(() => Console.WriteLine("Hello from task at {0}", DateTime.Now.ToString()));
        taskA.Start();
        return taskA;
    }
}
person Cycloguy    schedule 04.05.2018

Я столкнулся с той же проблемой. Когда я загрузил кварц из «Управление пакетами NuGet», он дал мне версию: 3.0.0-alpha2 (предварительная версия). Это вызвало ошибку, которую вы сейчас видите. Я нашел более раннюю версию по адресу https://www.nuget.org/packages/Quartz/2.3.3 следовал инструкциям по установке, пересобрал мою программу, и она заработала как надо.

person ScottyD    schedule 05.01.2017

Я не могу объяснить в совершенстве, но я знаю, как это работает.

IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();

Вам нужно получить результат GetDefaultScheduler(), чтобы он выглядел так:

IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;
person Noel Nemeth    schedule 24.06.2018

Если вы находитесь в контексте async/await, используйте ответ @Cycloguy. В противном случае (например, регистрация IScheduler в DI-контейнере):

ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = schedulerFactory.GetScheduler()
                                       .ConfigureAwait(false)
                                       .GetAwaiter()
                                       .GetResult();
person amiry jd    schedule 20.11.2018

Еще одно примечание к ответам на данный момент.

Как упоминал Cycloguy, в Quartz 3.0.0 произошло много «критических» изменений. По состоянию на 08.11.19 в VisualStudio 2017 3.0.7 является текущей версией Quartz.

Альтернативное решение: попробуйте установить версию Quartz до 3.0.0 (например, 2.4.1). Не лучшее долгосрочное решение, но отличный пластырь, если вы спешите.

Пример. Quartz Version 2.4.1 отлично работает с .NET 4.6.2 в VS2017. (И избегает этой ошибки.)

Скоро буду устанавливать 3.0.7. Но мне нужен этот пластырь, чтобы временно ковылять.

Приложение: Диспетчер пакетов VS2007 Nuget делает странные вещи на своем дисплее. Технически это нормально, но приводит непосредственно к этой ошибке.

Если вы просматриваете установленные элементы, справа отображается текущая версия... НЕ версия, которую вы установили.
Диспетчер пакетов VS2007 Nuget для Quartz

В предыдущем образе установлена ​​версия 2.4.1. Итак, как разработчик, если вы смотрите на старый код, легко (при быстром сканировании) подумать, что старый код использует версию 3.0.7. Однако не используйте номер версии в строках «установлено» для определения номера вашей версии; поле немного справа, которое показывает фактическую реализованную версию.

введите здесь описание изображения

И именно это (использование >=3.0.0, когда вы действительно хотели ‹3.0.0, по крайней мере временно) легко приводит к ошибке, которая обсуждается на этой странице.

person Michael M.    schedule 08.11.2019