【问题标题】:Quartz.NET error comes every time I use it每次使用 Quartz.NET 都会出现错误
【发布时间】:2016-11-05 11:01:22
【问题描述】:

我在这行得到一个错误提示:

无法将类型“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();
    }
}

【问题讨论】:

  • 你试过了吗:ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler = schedulerFactory.GetScheduler();
  • 您是否可能有另一个名为 StdSchedulerFactory 的类,它有一个名为 GetDefaultScheduler 的方法,该方法返回一个任务?如果是这样,请尝试IScheduler scheduler = Quartz.Impl.StdSchedulerFactoryy.GetDefaultScheduler();

标签: triggers quartz-scheduler scheduler quartz.net quartz


【解决方案1】:

从版本 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;
    }
}

【讨论】:

    【解决方案2】:

    我无法完美解释,但我知道它是如何工作的。

    IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
    

    你需要得到GetDefaultScheduler()的结果,它看起来像:

    IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。当我从 Manage NuGet Packages 加载石英时,它给了我版本:3.0.0-alpha2(预发布)。这导致了您当前看到的错误。我在https://www.nuget.org/packages/Quartz/2.3.3 找到了一个较早的版本,按照说明安装它,重建了我的程序,它运行正常。

      【讨论】:

        【解决方案4】:

        如果您处于async/await 上下文中,请使用@Cycloguy 的答案。其他(例如在 DI 容器中注册 IScheduler):

        ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
        IScheduler scheduler = schedulerFactory.GetScheduler()
                                               .ConfigureAwait(false)
                                               .GetAwaiter()
                                               .GetResult();
        

        【讨论】:

          【解决方案5】:

          到目前为止,对答案的补充说明。

          正如 Cycloguy 所说,Quartz 3.0.0 发生了许多“重大”变化。 截至 2019 年 11 月 8 日在 VisualStudio 2017 中,3.0.7 是 Quartz 的当前版本。

          替代解决方案:尝试安装 3.0.0 之前的 Quartz 版本(例如 2.4.1)。不是一个很好的长期解决方案,但如果你赶时间的话,它是一个很好的创可贴。

          示例。 Quartz 版本 2.4.1 在 VS2017 中与 .NET 4.6.2 配合良好。 (并且避免了这个错误。)

          我将很快安装 3.0.7。但是,我需要这个创可贴暂时蹒跚前行。

          附录:VS2007 Nuget 包管理器在其显示中做了一件奇怪的事情。从技术上讲“没问题”,但会直接导致此错误。

          如果您正在查看已安装的项目,右侧会显示当前版本...不是您已安装的版本。

          在上图中,安装的版本是 2.4.1。因此,作为开发人员,如果您正在查看旧代码,很容易(在进行快速扫描时)认为旧代码使用的是 3.0.7 版本。但是,不要使用“已安装”行中的版本号来确定您的版本号;稍微靠右的方框显示了实际实现的版本。

          正是这个(当你真正想要 =3.0.0,至少暂时如此)很容易导致本页讨论的错误。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-23
            • 2020-05-18
            • 1970-01-01
            • 1970-01-01
            • 2019-11-24
            相关资源
            最近更新 更多