我有自己的ITrigger
。基本上,它看起来如下:
public interface ITrigger : IDisposable
{
/// <summary>
/// Occurs when an input has been trigger.
/// </summary>
event InputTriggedEventHandler InputTrigged;
/// <summary>
/// Starts the trigger.
/// </summary>
/// <param name="trigger">The data about the trigger to start.</param>
void Init(Trigger trigger);
}
此接口的一个实现是FileCreatedTrigger
,它在创建文件时触发事件。
我想要另一个实现,我可以将Trigger
设置为以特定间隔触发(非常类似于Windows任务计划程序)。所以,我看了Quartz.Net,这几乎是我想要的。
问题是如何从IJob
触发InputTrigged事件?这是Quartz使用的。 IJob只实现了无法调用父节点的执行(在这种情况下是ITrigger
,因为它不知道它是哪个实例。
ITrigger
时保持我的界面Quartz.Net
,{{1}}具有另一种如何触发的实现。
答案 0 :(得分:0)
我最终做的是保持对使用guid作为键的ScheduleTriggers的静态引用。然后将guid传递给jobdetail,使用它来查找ScheduleTrigger并引发事件。不漂亮,但做的工作是:
public class ScheduleTrigger : BaseTrigger
{
Guid name = Guid.NewGuid();
static Dictionary<Guid, ScheduleTrigger> triggers = new Dictionary<Guid, ScheduleTrigger>();
public static Dictionary<Guid, ScheduleTrigger> Triggers
{
get
{
return triggers;
}
}
public void Init(Trigger triggerParam)
{
....
JobDetail jobDetail = new JobDetail(name.ToString(), Type.GetType(schedTrig.JobType.JobClassName));
Triggers.Add(name, this);
}
public void Dispose()
{
if (Triggers.ContainsKey(name))
{
triggers.Remove(name);
}
base.Dispose();
}
internal void RaiseEvent()
{
base.OnInputTrigged(string.Empty);
}
}
筹集活动的非常简单的工作
EventRaiserJob : IJob
{
public void Execute(JobExecutionContext context)
{
Guid name = new Guid(context.JobDetail.Name);
ScheduleTrigger.Triggers[name].RaiseEvent();
}
}