我在这行中收到错误说:
无法隐式转换类型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();
}
}
答案 0 :(得分:9)
从版本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;
}
}
答案 1 :(得分:3)
我遇到了同样的问题。当我从Manage NuGet Packages加载石英时,它给了我版本:3.0.0-alpha2(Prerelease)。这导致您当前看到的错误。我在https://www.nuget.org/packages/Quartz/2.3.3找到了一个早期版本,按照说明安装它,重建我的程序,它就像它应该的那样工作。
答案 2 :(得分:2)
我无法完美解释,但我知道它是如何工作的。
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
您需要获取GetDefaultScheduler()
的结果,如下所示:
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;
答案 3 :(得分:0)
如果您处于async/await
上下文中,请使用@Cycloguy的答案。其他(例如,在DI容器中注册IScheduler
)
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = schedulerFactory.GetScheduler()
.ConfigureAwait(false)
.GetAwaiter()
.GetResult();
答案 4 :(得分:0)
到目前为止,对答案的另一注。
正如Cycloguy提到的,Quartz 3.0.0发生了许多“重大”更改。 从Visual Studio 2017中的19/8/19起,最新版本为3.0.7。
替代解决方案:尝试安装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时使用> = 3.0.0,至少是暂时的),很容易导致该错误,本页将对此进行讨论。