我有一个实例化Quartz Scheduler的控制台应用程序 我想要一个Job来引发一个事件处理程序,以便“母亲应用程序”调用一个特定的方法 问题是,Job Class似乎与外部类很相似。我相信有一个很好的方法可以做到这一点,但我还没有发现它。
public class RestartJob : IJob
{
public RestartJob()
{
}
public virtual void Execute(IJobExecutionContext context)
{
//Send Restart EventHandler Subscription to Console.
}
}
答案 0 :(得分:3)
我通过在包含Scheduler Logic的类上实现单例解决了我的问题。 有魅力。希望这可以帮助其他人解决我认为的“必备”功能。
public class Skeduler
{
private static Skeduler instance;
public static Skeduler Instance
{
get
{
if (instance == null)
{
instance = new Skeduler();
}
return instance;
}
}
public delegate void SendRestartX();
public event SendRestartX SendRestart;
public void doSendRestart()
{
if (SendRestart!=null)
SendRestart();
}
//(Job Methods & Logics Goes Here)
}
public class RestartJob : IJob
{
//Required
public RestartJob()
{
}
public virtual void Execute(IJobExecutionContext context)
{
Skeduler.Instance.doSendRestart();
}
}
用法:
public MainClass
{
public void Run()
{
skeduler = Skeduler.Instance;
skeduler.SendRestart += new Skeduler.SendRestartX(MethodToCall);
}
}
答案 1 :(得分:2)
您可以在JobDataMap中传递事件处理程序,然后使用作业中的事件处理程序。
创建工作时
IJobDetail job = JobBuilder.Create<RestartJob>().WithIdentity("job"), "group")
.SetJobData(new JobDataMap{{"event-handler", YourEventHandler}});
在你的工作班上:
public class RestartJob : IJob
{
public RestartJob()
{
}
public virtual void Execute(IJobExecutionContext context)
{
var @event = context.JobDetail.JobData["event-handler"];
@event?.Invoke(YourEventParameters);
}
}
答案 2 :(得分:1)
你可以试试这个: 创建IJobDetail:
IJobDetail job = JobBuilder.Create<LogJob>().WithIdentity("job"), "group")
.UsingJobData("id", 123).Build();
job.JobDataMap["SOMENAME"] = this;
用法:
public void Execute(IJobExecutionContext context) {
JobDataMap dataMap = context.JobDetail.JobDataMap;
CLASSNAME SOMENAME = dataMap["SOMENAME"] as MediaPlaylistsAds;
int id = (int)dataMap["id"];
SOMENAME.SOMEFUNC(id);
}