Triggers 每次使用Quartz.NET时都会出现错误

Triggers 每次使用Quartz.NET时都会出现错误,triggers,quartz-scheduler,scheduler,quartz.net,quartz,Triggers,Quartz Scheduler,Scheduler,Quartz.net,Quartz,我在这行中得到一个错误,说: 无法将类型“System.Threading.Tasks.Task”隐式转换为“Quartz.IsScheduler”。存在显式转换(是否缺少强制转换?) 如何解决;我不明白?请帮忙 isScheduler scheduler=StdSchedulerFactory.GetDefaultScheduler() publicstaticvoidstart() { 尝试 { //构造调度程序工厂 //isScheduler scheduler=schedulerFact

我在这行中得到一个错误,说:

无法将类型“System.Threading.Tasks.Task”隐式转换为“Quartz.IsScheduler”。存在显式转换(是否缺少强制转换?)

如何解决;我不明白?请帮忙

isScheduler scheduler=StdSchedulerFactory.GetDefaultScheduler()

publicstaticvoidstart()
{
尝试
{
//构造调度程序工厂
//isScheduler scheduler=schedulerFactory.GetScheduler();
//isScheduler scheduler=StdSchedulerFactory.GetDefaultScheduler();
isScheduler scheduler=StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();
IJobDetail job=JobBuilder.Create()
.WithIdentity(“作业名称”、“作业组”)
.Build();
ITrigger trigger=TriggerBuilder.Create()
.WithSimpleSchedule(s=>s.WithIntervalInSeconds(60).RepeatForever()
.StartNow()
.Build();
ScheduleJob(作业,触发器);
//scheduler.Start();
}
捕获(调度)
{
//控制台写入线(se);
}
}
}
公共类HelloJob:IJob
{
私有TBPESContext db=新TBPESContext();
public void Execute(IJobExecutionContext上下文)
{
var AuthorName=来自db.Twitter\u帐户中的twitterAccount
来自twitterAccount.课程中的c
选择twitterAccount.Author\u Name;
foreach(AuthorName中的变量项)
{
TweetCrawler.SaveTweets(项目);
}
抛出新的NotImplementedException();
}
}

我遇到了同样的问题。当我从Manage NuGet软件包中加载quartz时,它给了我版本:3.0.0-alpha2(预发布)。这导致了您当前看到的错误。我在上找到了一个早期版本,按照说明安装了它,重新编译了我的程序,它正常工作

来自3.0.0版Quartz::

  • 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;
    }
}
类程序
{
静态void Main(字符串[]参数)
{
JobScheduler JobScheduler=新的JobScheduler();
jobScheduler.Start();
Console.ReadLine();
}
}
公共类作业调度器
{
公共异步void Start()
{
isSchedulerFactory schedulerFactory=新StdSchedulerFactory();
IsScheduler scheduler=等待schedulerFactory.GetScheduler();
wait scheduler.Start();
IJobDetail job=JobBuilder.Create().Build();
ITrigger trigger=TriggerBuilder.Create()
.WithIdentity(“HelloJob”、“问候组”)
.WithCronSchedule(“0 0/1*1/1*?*”)
.StartAt(DateTime.UtcNow)
.优先权(1)
.Build();
wait scheduler.ScheduleJob(作业,触发器);
}
}
公共类HelloJob:IJob
{
任务IJob.Execute(IJobExecutionContext上下文)
{
if(上下文==null)
{
抛出新ArgumentNullException(nameof(context));
}
Task taskA=new Task(()=>Console.WriteLine(“来自{0}的任务的Hello”,DateTime.Now.ToString());
taskA.Start();
返回任务a;
}
}

我不能很好地解释,但我知道它是如何工作的。

您需要获得
GetDefaultScheduler()
的结果,使其看起来像:


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


到目前为止,答案还有一个补充说明

正如Cycloguy所提到的,Quartz 3.0.0发生了许多“突破性”变化。 截至2017年VisualStudio的19年8月11日,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,你是否尝试过:
isSchedulerFactory schedulerFactory=new StdSchedulerFactory();Scheduler=schedulerFactory.GetScheduler();
是否可能有另一个名为StdSchedulerFactory的类,该类有一个名为GetDefaultScheduler的方法,该方法返回任务?如果有,请尝试
isScheduler scheduler=Quartz.Impl.StdSchedulerFactory.GetDefaultScheduler();
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;
    }
}
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = schedulerFactory.GetScheduler()
                                       .ConfigureAwait(false)
                                       .GetAwaiter()
                                       .GetResult();