我想在应用程序启动期间使用任务调度程序创建线程。 我感谢this和this,但出了问题,工作没有运行,当然是在之前初始化了。
我的课程在开始之前运行:
[assembly: WebActivatorEx.PreApplicationStartMethod(
typeof(Application.App_Start.TaskScheduler), "Start")]
namespace Application.App_Start
{
public static class TaskScheduler
{
private static readonly IScheduler scheduler = new StdSchedulerFactory().GetScheduler();
private static void CreateTaskToDeleteTmpFiles(Object sender)
{
scheduler.Start();
//Create job which will be add to thread
IJobDetail job = JobBuilder.Create<DeleteTmpJob>()
.WithIdentity("ClearTmpFiles")
.StoreDurably()
.Build();
//Create thread which run the job after specified conditions
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("ClearTmpFiles")
.StartAt(DateBuilder.FutureDate(1, IntervalUnit.Second))
.Build();
//Add Job and Trigger to scheduler
scheduler.ScheduleJob(job, trigger);
}
}
}
我的工作班:
public class DeleteTmpJob : IJob
{
private IDocumentStore documentStore;
private IUploaderCollection uploaderCollection;
public DeleteTmpJob(IDocumentStore _documentStore, IUploaderCollection _uploaderCollection)
{
documentStore = _documentStore;
uploaderCollection = _uploaderCollection;
}
public void Execute(IJobExecutionContext context)
{
documentStore.ClearTmpDirectory();
}
}
作业未运行
任何人都可以提供帮助吗?
答案 0 :(得分:1)
当我删除构造函数时,我遇到了同样的问题。首先尝试调用基础构造函数,如果它仍然无法工作,请尝试删除构造函数。
答案 1 :(得分:1)
您是否尝试过为您的工作使用空构造函数?
“调度程序执行作业的每个(和每个)时间,它在调用其Execute(..)方法之前创建该类的新实例。此行为的一个后果是作业必须为no -arguement构造函数。“
您可能需要实现自己的JobFactory才能使用DI。如何实现它取决于您使用的库。
“当触发器触发时,它所关联的JobDetail(实例定义)被加载,它引用的作业类通过Scheduler上配置的JobFactory实例化。默认的JobFactory只调用作业的默认构造函数class使用Activator.CreateInstance,然后尝试在类上调用与JobDataMap中的键名匹配的setter属性。您可能想要创建自己的JobFactory实现来完成诸如使用应用程序的IoC或DI容器之类的事情生成/初始化作业实例。“
来源:see here